Étant donné un exemple comme celui-ci:

class MyForm(forms.Form): 
    name = forms.CharField()

J'essaie de comprendre quelle est la différence entre les deux extraits suivants:

Style "Données liées":

my_form = MyForm({'name': request.user.first_name})

Style "Données initiales":

my_form = MyForm(initial={'name': request.user.first_name})

La documentation semble suggérer que «initial est pour les valeurs initiales dynamiques», et pourtant être capable de transmettre des «données liées» au constructeur accomplit exactement la même chose. J'ai utilisé des données initiales dans le passé pour des valeurs dynamiques, mais je suis tenté d'utiliser le style plus simple de "données liées", mais j'aimerais avoir un aperçu de la vraie différence entre ces deux styles.

21
slacy 27 oct. 2011 à 21:49

3 réponses

Meilleure réponse

Voici la partie clé des documents django sur lié et formulaires non liés.

Une instance de formulaire est soit liée à un ensemble de données, soit non liée :

  • S'il est lié à un ensemble de données, il est capable de valider ces données et de rendre le formulaire au format HTML avec les données affichées dans le HTML.
  • S'il est non lié , il ne peut pas faire de validation (car il n'y a pas de données à valider!), Mais il peut toujours rendre le formulaire vierge au format HTML.

Vous ne pouvez pas vraiment voir la différence pour l'exemple de formulaire que vous avez donné, car le formulaire est valide dans le style "données liées". Étendons le formulaire en ajoutant un champ age, alors la différence sera plus évidente.

class MyForm(forms.Form):
    name = forms.CharField()
    age = forms.IntegerField()

Forme liée

my_form = MyForm({'name': request.user.first_name})

Ce formulaire n'est pas valide, car age n'est pas spécifié. Lorsque vous rendez le formulaire dans le modèle, vous verrez des erreurs de validation pour le champ age.

Formulaire non lié avec des données initiales dynamiques

my_form = MyForm(initial={'name':request.user.first_name})

Ce formulaire n'est pas lié. La validation n'est pas déclenchée, il n'y aura donc aucune erreur affichée lors du rendu du modèle.

36
Alasdair 6 déc. 2015 à 09:20

Une autre différence est que data attend quelque chose que les widgets peuvent analyser alors que initial est par champ. Cela fait une différence si vous par exemple utilisez MultiWidget s. Dans ce cas, data doit contenir quelque chose comme

{'myfield_0': 'data for subwidget 0', 
 'myfield_1': 'data for subwidget 1'}

Alors que initial attend quelque chose comme ceci:

{'myfield': 'data for subwidget 0,data for subwidget 1'}
3
Tomasz Zieliński 27 janv. 2013 à 13:50

Non, ce n'est pas la différence (et je serais curieux de savoir d'où dans la documentation vous avez cette impression). La différence est de savoir si la validation est effectuée.

Les données initiales ne déclenchent pas de validation. Cela vous permet, par exemple, de pré-remplir certains champs mais de laisser d'autres vides, même s'ils sont obligatoires. Si vous utilisez des données liées, vous obtiendrez des erreurs pour ces champs obligatoires vides, même lors de la première visualisation de ce formulaire, ce qui serait gênant pour l'utilisateur.

Les données liées, bien sûr, déclenchent la validation. De plus, si vous utilisez un modèle, l'instance associée ne sera mise à jour qu'avec les données liées, pas les données initiales.

7
Daniel Roseman 27 oct. 2011 à 18:08
7920128