tipos personalizados partir modelos formularios examples example avanzados django django-forms

partir - formularios personalizados django



Rellenar previamente el formulario Django(no modelo) (4)

Estoy tratando de rellenar previamente los datos en mi formulario de django basándose en cierta información, pero NO estoy usando ModelForm, así que no puedo simplemente establecer la instancia

Esto parece que debería ser realmente fácil, pero por alguna razón no puedo encontrar ninguna documentación que me indique cómo hacerlo. Esta es mi forma:

class MyForm(forms.Form): charfield1 = forms.CharField(max_length=3) charfield2 = forms.CharField(max_length=3) choicefield = forms.ModelChoiceField(MyModel.objects.all())

Traté de hacer simplemente

form = MyForm() form.charfield1 = "foo" form.charfield2 = "bar" # a model choice field form.choicefield = MyModel.objects.get(id=3)

Lo que no funciona.


Hay dos formas de rellenar un formulario Django.

El primero es pasar un diccionario como primer argumento cuando lo ejemplifica (o lo pasa como el kwarg de data , que es lo mismo). Esto es lo que hace cuando desea utilizar los datos de POST para completar y validar el formulario.

data_dict = {''charfield1'': ''data1'', ''charfield2'': ''data2'', ''choicefield'': 3} form = MyForm(data_dict)

Sin embargo, esto activará la validación en el formulario, por lo que solo funciona si, en realidad, está pasando datos válidos y completos; de lo contrario, comenzará con errores.

La otra forma de rellenar un formulario es usar el parámetro initial (documentado here ). Esto proporciona valores iniciales para los campos del formulario, pero no activa la validación. Por lo tanto, es adecuado si no está completando todos los valores, por ejemplo.

form = MyForm(initial=data_dict)

Para rellenar un campo de selección a través de la initial , use el valor pk.


Para lo que vale la pena, la forma de vista basada en clases de FormView para hacer esto sería anular la función get_initial . get_initial devuelve los argumentos de palabras clave iniciales utilizados por get_form_kwargs para crear una instancia del formulario.

Docs:

  • para get_initial , here ,
  • para get_form_kwargs , here .

Código de muestra:

from django.views.generic.edit import FormView class MyFormView(FormView): def get_initial(self): initial = super(MyFormView, self).get_initial() # update initial field defaults with custom set default values: initial.update({''charfield1'': ''foo'', ''charfield2'': ''bar''}) return initial


Puede usar model_to_dict () para convertir una instancia en un diccionario y luego rellenar un formulario con eso. Algo como esto debería funcionar:

from django.forms.models import model_to_dict ... my_obj = MyModel.objects.get(abc=123) form = MyForm(initial=model_to_dict(my_obj))

Nota: Estoy usando la versión 1.3 de Django.


Tratar:

form = MyForm({''charfield1'': ''foo'', ''charfield2'': ''bar''})

El constructor de objetos Form puede tomar un diccionario de valores de campo. Esto crea un formulario enlazado, que se puede utilizar para validar los datos y representar el formulario como HTML con los datos mostrados. Consulte la documentación de la API de formularios para obtener más detalles.

Editar:

En aras de la integridad, si no desea enlazar el formulario y solo desea declarar valores iniciales para algunos campos, puede usar lo siguiente:

form = MyForm(initial={''charfield1'': ''foo'', ''charfield2'': ''bar''})

Consulte la documentación de valores iniciales para más detalles.