É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.
3 réponses
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.
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'}
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.
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.