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:
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.