Relation entre Bound / Unbound et la valeur initiale du formulaire Django2

supposition

Pour les débutants qui ont utilisé toutes les fonctions de base de Django.

environnement

introduction

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.

Image utilisant le formulaire

Tout d'abord, illustrons une image approximative du formulaire. フォームイメージ1.png

Remplissage de formulaire

Ensuite, il représente les principaux éléments d'entrée du formulaire (éléments de l'argument de la méthode \ _ \ _ init \ _ \ _ ()). フォームイメージ2.png

Ce qui suit montre à quoi correspond chaque élément d'entrée.

data
request.GET, request.POST
files
request.FILES
instance
instance de modèle / jj>
initial
Dictionnaire avec les valeurs initiales

Qu'est-ce que lié / non lié?

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.

Formulaire lié
Un formulaire avec l'un parmi request.GET, request.POST ou request.FILES
Formulaire non lié
Formulaire sans request.GET, request.POST, request.FILES

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)

Relation entre la valeur liée / non liée et la valeur initiale

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>.

Contre-mesures

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.

Priorité de valeur

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.)

  1. data (request.GET, request.POST)
  2. initial
  3. instance
  4. Valeur initiale du champ de formulaire ⇒ Une valeur à définir comme "some_field = forms.CharField (initial =" init value ")" dans la définition du champ de formulaire.

Dans ModelForm, la valeur par défaut de Model semble être l'initiale du champ de formulaire, mais cela ne semble pas l'être.

en conclusion

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.