Django définit la valeur du champ après l'initialisation d'un formulaire

J'essaie de définir le champ à une certaine valeur après l'initialisation du formulaire.

Par exemple, j'ai la classe suivante.

class CustomForm(forms.Form):
    Email = forms.EmailField(min_length=1, max_length=200)

Dans la vue, je veux être capable de faire quelque chose comme ceci:

form = CustomForm()
form["Email"] = GetEmailString()

return HttpResponse(t.render(c))
91
demandé sur Eldila 2009-05-02 01:39:47

6 réponses

Puisque vous ne transmettez pas de données POST, je suppose que ce que vous essayez de faire est de définir une valeur initiale qui sera affichée dans le formulaire. La façon dont vous le faites est avec le mot-clé initial.

form = CustomForm(initial={'Email': GetEmailString()})

Voir les documents de Formulaire Django pour plus d'explications.

Si vous essayez de modifier une valeur après que le formulaire a été soumis, vous pouvez utiliser quelque chose comme:

if form.is_valid():
    form.cleaned_data['Email'] = GetEmailString()

Vérifiez les documents référencés ci-dessus pour plus d'informations sur l'utilisation de cleaned_data

112
répondu Grant 2009-05-01 21:58:13

Si vous avez déjà initialisé le formulaire, vous pouvez utiliser la propriété du terrain. Par exemple,

form = CustomForm()
form.fields["Email"].initial = GetEmailString()
81
répondu Josh 2012-05-24 22:59:08

Quelque chose comme Nigel Cohen fonctionnerait si vous ajoutiez des données à une Copie de l'ensemble collecté de données de formulaire:

form = FormType(request.POST)
if request.method == "POST":
    formcopy = form(request.POST.copy())
    formcopy.data['Email'] = GetEmailString()
6
répondu Milo P 2013-11-26 21:16:57

Si vous voulez le faire dans la méthode __init__ du formulaire pour une raison quelconque, vous pouvez manipuler le dict initial:

class MyForm(forms.Form):
    my_field = forms.CharField(max_length=255)

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.initial['my_field'] = 'Initial value'
6
répondu seddonym 2015-08-25 11:14:16

Il suffit de changer votre formulaire.champ de données:

class ChooseProjectForm(forms.Form):
    project = forms.ModelChoiceField(queryset=project_qs)
    my_projects = forms.BooleanField()

    def __init__(self, *args, **kwargs):
        super(ChooseProjectForm, self).__init__(*args, **kwargs)
        self.data = self.data.copy()  # IMPORTANT, self.data is immutable
        # any condition:
        if self.data.get('my_projects'):
            my_projects = self.fields['project'].queryset.filter(my=True)
            self.fields['project'].queryset = my_projects
            self.fields['project'].initial = my_projects.first().pk
            self.fields['project'].empty_label = None  # disable "-----"
            self.data.update(project=my_projects.first().pk)  # Update Form data
            self.fields['project'].widget = forms.HiddenInput()  # Hide if you want
1
répondu ckarrie 2016-09-22 12:37:22

Une autre façon de le faire, si vous avez déjà initialisé un formulaire (avec ou sans données), et que vous devez ajouter d'autres données avant de l'afficher:

form.data['Email] = GetEmailString()
-12
répondu Nigel Cohen 2011-04-04 15:43:01