111 votes

Réglage de la valeur sélectionnée sur un Django formes.ChoiceField

Ici, c'est le champ de la déclaration dans un formulaire:

max_number = forms.ChoiceField(widget = forms.Select(), 
                     choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

Je voudrais définir la valeur initiale de 3 et cela ne semble pas fonctionner. J'ai joué avec le param, des citations/pas de guillemets, etc... mais pas de changement.

Quelques résultats que j'ai trouvé grâce à Google suggèrent qu'il est possible de définir la valeur initiale, mais j'ai jamais réussi à le faire fonctionner! Je suis sur django 1.0.

Quelqu'un pourrait-il me donner une réponse définitive si elle est possible? Et/ou les tordre dans mon extrait de code?

Merci beaucoup.

120voto

Tom Points 8420

Essayez de définir la valeur initiale lorsque vous instanciez la forme:

form = MyForm(initial={'max_number': '3'})

103voto

colinta Points 682

Ce n'est pas tactile sur la question immédiate à portée de main, mais ce Q/A vient pour les recherches liées à l'assigner la valeur d'un ChoiceField.

Si vous avez déjà appelé super().__init__ dans votre classe de Formulaire, vous devez mettre à jour l' form.initial dictionnaire, pas le field.initial de la propriété. Si vous étudiez form.initial (par exemple, print self.initial après l'appel à super().__init__), il contiendra les valeurs pour tous les champs. Ayant une valeur de None dans ce dict va se substituer à l' field.initial de la valeur.

par exemple

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        # assign a (computed, I assume) default value to the choice field
        self.initial['choices_field_name'] = 'default value'
        # you should NOT do this:
        self.fields['choices_field_name'].initial = 'default value'

54voto

Burton Williams Points 201

Vous pouvez également effectuer les opérations suivantes. dans votre formulaire de classe def:

max_number = forms.ChoiceField(widget = forms.Select(), 
                 choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

ensuite, lors de l'appel de la forme de votre point de vue, vous pouvez définir dynamiquement les deux choix de départ et la liste de choix.

yourFormInstance = YourFormClass()

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)]
yourFormInstance.fields['max_number'].initial = [1]

Remarque: les valeurs initiales a la forme d'une liste et le choix de 2-tuples, dans mon exemple ci-dessus j'ai une liste de 2-tuples. Espérons que cette aide.

20voto

Dave Points 1274

J'ai rencontré ce problème, et compris que le problème est dans le navigateur. Lorsque vous actualisez le navigateur est de remplir à nouveau le formulaire avec les mêmes valeurs qu'avant, en ignorant les bagages champ. Si vous affichez la source, vous verrez que la valeur est correcte. Ou placez votre curseur dans le champ URL du navigateur et appuyez sur entrée. Qui sera re-charger le formulaire à partir de zéro.

7voto

Pie21 Points 639

Tom Burton et les réponses de travail pour moi, mais finalement j'ai eu un peu de mal à comprendre comment les appliquer à un ModelChoiceField.

Le seul truc, c'est que les choix sont stockées comme des n-uplets d' (<model's ID>, <model's unicode repr>), donc si vous souhaitez définir le modèle initial de sélection, vous passez le modèle de l' ID de la valeur initiale, et non pas l'objet lui-même ou en son nom ou quoi que ce soit d'autre. Puis c'est aussi simple que:

form = EmployeeForm(initial={'manager': manager_employee_id})

Sinon l' initial argument peut être ignoré en place d'une ligne supplémentaire avec:

form.fields['manager'].initial = manager_employee_id

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X