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.

48
demandé sur Cory 2009-06-01 23:35:29

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.

84
répondu Ayman Hourieh 2017-11-03 08:29:25

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.

25
répondu Daniel Roseman 2009-06-01 20:31:54

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

13
répondu Andrew Calder 2013-02-20 01:52:21

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:

  • pour get_initial, ici,
  • pour get_form_kwargs, ici.

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
2
répondu Joseph Victor Zammit 2017-08-27 17:18:15