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.
Essayez de définir la valeur initiale lorsque vous instanciez le formulaire:
form = MyForm(initial={'max_number': '3'})
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'
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.
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.
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
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
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é.