Pré-remplir la forme Django (non-modèle)
J'essaie de pré-remplir les données dans mon formulaire django en fonction de certaines informations, mais sans utiliser ModelForm, donc je ne peux pas simplement définir l'instance.
Cela semble être vraiment facile, mais pour une raison quelconque, Je ne trouve aucune documentation me disant Comment faire cela. C'est ma forme:
class MyForm(forms.Form):
charfield1 = forms.CharField(max_length=3)
charfield2 = forms.CharField(max_length=3)
choicefield = forms.ModelChoiceField(MyModel.objects.all())
J'ai essayé juste de faire:
form = MyForm()
form.charfield1 = "foo"
form.charfield2 = "bar"
# a model choice field
form.choicefield = MyModel.objects.get(id=3)
Qui ne fonctionne pas.
4 réponses
Essayez:
form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'})
Le constructeur des objets Form
peut prendre un dictionnaire de valeurs de champ. Cela crée un formulaire lié, qui peut être utilisé pour valider les données et rendre le formulaire en HTML avec les données affichées. Voir la documentation de l'API de formulaires pour plus de détails.
Modifier:
Par souci d'exhaustivité, si vous ne voulez pas lier le formulaire et que vous voulez simplement déclarer des valeurs initiales pour certains champs, vous pouvez utiliser ce qui suit au lieu de cela:
form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'})
, Voir la documentation de valeurs initiales pour plus de détails.
Il y a deux façons de remplir un formulaire Django.
Le premier est de passer un dictionnaire comme premier argument lorsque vous l'instanciez (ou de le passer comme data
kwarg, ce qui est la même chose). C'est ce que vous faites lorsque vous souhaitez utiliser des données POST pour remplir et valider le formulaire.
data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3}
form = MyForm(data_dict)
Cependant, cela déclenchera validation sur le formulaire, donc ne fonctionne que si vous transmettez réellement des données valides et complètes pour commencer-sinon vous commencerez par erreur.
Autre façon de remplir un formulaire est à utiliser le initial
paramètre (documenté ici). Cela donne des valeurs initiales pour les champs de formulaire, mais ne déclenche pas la validation. Il est donc approprié si vous ne remplissez pas toutes les valeurs, par exemple.
form = MyForm(initial=data_dict)
Pour remplir un champ de choix via initial
, Utilisez la valeur pk.
Vous pouvez utiliser model_to_dict() pour convertir une instance en Dictionnaire, puis remplir un formulaire avec cela. Quelque chose comme ça devrait fonctionner:
from django.forms.models import model_to_dict
...
my_obj = MyModel.objects.get(abc=123)
form = MyForm(initial=model_to_dict(my_obj))
Note: j'utilise django version 1.3
Pour ce que ça vaut, la méthode de vue basée sur la classe FormView
serait de remplacer la fonction get_initial
de FormView
. get_initial
renvoie les arguments de mots clés initiaux utilisés par get_form_kwargs
pour instancier le formulaire.
Docs:
Exemple de code:
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