web-dev-qa-db-fra.com

Définir la valeur sélectionnée sur un Django forms.ChoiceField

Voici la déclaration de champ 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 à 3 et cela ne semble pas fonctionner. J'ai joué avec le param, citations/pas de citations, etc ... mais pas de changement.

Quelqu'un pourrait-il me donner une réponse définitive si cela est possible? Et/ou le Tweak nécessaire dans mon extrait de code?

J'utilise Django 1.

105
thebiglife

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

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

Cela ne touche pas la question immédiate, mais ce Q/A revient pour des recherches liées à la tentative d’attribution de la valeur sélectionnée à un ChoiceField.

Si vous avez déjà appelé super().__init__ dans votre classe Form, vous devez mettre à jour le dictionnaire form.initial Et non la propriété field.initial. Si vous étudiez form.initial (Par exemple print self.initial Après l’appel de super().__init__), il contiendra des valeurs pour tout les champs. Avoir une valeur de None dans ce dict annulera la valeur field.initial.

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'
85
colinta

Vous pouvez également faire ce qui suit. dans votre classe de forme def:

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

ensuite, lorsque vous appelez le formulaire dans votre vue, vous pouvez définir de manière dynamique les choix initiaux et la liste des choix.

yourFormInstance = YourFormClass()

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

Remarque: les valeurs initiales doivent être une liste et les choix doivent être 2-Tuples. Dans mon exemple ci-dessus, j'ai une liste de 2-Tuples. J'espère que cela t'aides.

39
Burton Williams

J'ai rencontré ce problème aussi et j'ai compris que le problème se trouvait dans le navigateur. Lorsque vous actualisez le navigateur, le formulaire est re-rempli avec les mêmes valeurs qu'auparavant, en ignorant le champ coché. Si vous affichez la source, vous verrez que la valeur cochée est correcte. Ou placez votre curseur dans le champ URL de votre navigateur et appuyez sur Entrée. Cela rechargera le formulaire à partir de zéro.

18
Dave

Les réponses de Tom et de Burton ont fini par me servir, mais j’ai eu un peu de mal à comprendre comment les appliquer à un ModelChoiceField .

Le seul truc, c’est que les choix sont stockés sous forme de nuplets de (<model's ID>, <model's unicode repr>), par conséquent, si vous souhaitez définir la sélection initiale du modèle, vous transmettez l’identifiant du modèle [~ # ~] [~ # ~] valeur, pas l'objet lui-même ou son nom ou quoi que ce soit d'autre. Alors c'est aussi simple que:

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

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

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

Dave - tu as de la chance de trouver une solution au problème du navigateur? Existe-t-il un moyen de forcer une actualisation?

En ce qui concerne le problème initial, essayez ce qui suit lors de l’initialisation du formulaire:

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value
3
user250240

Pour être sûr, j'ai besoin de voir comment vous rendez le formulaire. La valeur initiale n'est utilisée que sous une forme non liée, si elle est liée et qu'une valeur pour ce champ n'est pas incluse, rien ne sera sélectionné.

1
Andrew Wilkinson