Pour les débutants qui ont utilisé toutes les fonctions de base de Django.
Ceci est une explication des paramètres de valeur initiale auxquels vous vous sentez accro lors de l'utilisation du formulaire. Notez que la description peut ne pas distinguer clairement Form / ModelForm.
Tout d'abord, illustrons une image approximative du formulaire.
Ensuite, il représente les principaux éléments d'entrée du formulaire (éléments de l'argument de la méthode \ _ \ _ init \ _ \ _ ()).
Ce qui suit montre à quoi correspond chaque élément d'entrée.
Il y a une description dans le document officiel que "la distinction entre lié / non lié est importante", mais il est difficile de comprendre le comportement du formulaire à moins que vous ne mainteniez cette option. La définition de Bound / Unbound est la suivante.
Cela peut également être vu dans le code source de la classe BaseForm.
#Partie du code de la classe BaseForm
self.is_bound = data is not None or files is not None
Voici quelques exemples d'arguments pouvant être utilisés pour instancier un formulaire afin de le rendre lié (ou non lié).
# Bound/Exemple de formulaire non lié
form_bound_1 = SomeForm(request.GET)
form_bound_2 = SomeForm(request.POST)
form_bound_3 = SomeForm(request.POST, request.FILES)
form_unbound_1 = SomeForm()
form_unbound_2 = SomeForm(initial={"some_field": "some_valule"})
form_unbound_3 = SomeModelForm(initial={"some_field": "some_valule"}, instance=some_instance)
form_bound_4 = SomeModelForm(request.POST, initial={"some_field": "some_valule"}, instance=some_instance)
Les «principaux éléments d'entrée du formulaire» et «Bound / Unbound» que nous avons vus jusqu'à présent sont liés au réglage de la valeur initiale. Le formulaire définit un ou plusieurs champs de saisie, ou champs, mais regardons le code où chaque champ obtient une valeur pour rendre le balisage Html.
#Méthode de classe BoundField
def value(self):
"""
Return the value for this BoundField, using the initial value if
the form is not bound or the data otherwise.
"""
data = self.initial
if self.form.is_bound:
data = self.field.bound_data(self.data, data)
return self.field.prepare_value(data)
D'après ce qui précède, nous pouvons voir que les valeurs de champ de formulaire lié n'utilisent pas (écrasent) initial </ b>. Sachez également que même si request.GET etc. est vide (≠ None), ce sera un formulaire lié </ b>.
Si vous souhaitez créer un formulaire de recherche ou utiliser Ajax pour le faire sur un seul écran, vous pouvez activer le paramètre de valeur initiale en créant des branches comme suit. (Le code n'est qu'un exemple.)
if "some_field" in request.GET:
form = SomeForm(request.GET)
else:
form = SomeForm(initial={"some_field": "some_value"})
Le problème ne se produit pas lors de la création et de la mise à jour du modèle dans des vues individuelles, mais il peut devenir addictif une fois que vous commencez à l'appliquer.
De plus, il convient de noter que les valeurs des champs de formulaire sont définies dans l'ordre de priorité suivant. (Pour être précis, c'est comme une "image prioritaire" qui ignore les différences liées / non liées, etc.)
Dans ModelForm, la valeur par défaut de Model semble être l'initiale du champ de formulaire, mais cela ne semble pas l'être.
Les parties "Bound / Unbound" et "Initial value setting" sont des parties que vous ne pouvez pas imaginer, c'est donc une bonne idée d'approfondir votre compréhension.
Recommended Posts