2010-03-24 20 views
6

La biblioteca de formularios de Django tiene una función de conjuntos de formularios que le permite procesar formularios agregados dinámicamente. Por ejemplo, usaría conjuntos de formularios si su aplicación tiene una lista de marcadores, podría usar conjuntos de formularios para procesar formularios múltiples que representan un marcador.Almacenar campos dinámicos en formularios de Django

¿Qué tal si quieres agregar dinámicamente un campo a un formulario? Un ejemplo sería una página de creación de encuestas donde puede agregar dinámicamente un número ilimitado de preguntas. ¿Cómo manejas esto en Django?

Respuesta

5

para añadir, eliminar y cambiar los campos de un formulario o ModelForm, simplemente anular __init__() así:

class MyForm(forms.Form): 
def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user') 
    other_stuff = kwargs.pop('stuff') 

    super(MyForm, self).__init__(*args, **kwargs) 

    self.fields['my_dynamic_field'] = forms.Field(...) 

    # Add fields based on user or other_stuff 

y utilizarlo como esto: form = MyForm(user = user, stuff = stuff)

+0

Nota: No puedo enviar al usuario kwarg a super __init__; raise "__init __() obtuvo un argumento de palabra clave inesperado 'user'" – ecdani

+0

Resuelto: kwargs.pop debe aparecer antes de la llamada súper – ecdani

5

en Python se puede crear una instancia de una clase dinámica. knutin muestra un buen ejemplo de la personalización dinámica de un formulario y la adición de algunos campos.

También puede crear toda forma dinámica, como toma de la example given by James Bennett:

def make_contact_form(user): 
    fields = { 'name': forms.CharField(max_length=50), 
      'email': forms.EmailField(), 
      'message': forms.CharField(widget=forms.Textarea) } 
    if not user.is_authenticated(): 
    fields['captcha'] = CaptchaField() 
    return type('ContactForm', (forms.BaseForm,), { 'base_fields': fields }) 
Cuestiones relacionadas