web-dev-qa-db-fra.com

Django a défini 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 pouvoir faire quelque chose comme ceci:

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

return HttpResponse(t.render(c))
97
Eldila

Étant donné que vous ne transmettez pas de données POST, je suppose que vous essayez de définir une valeur initiale qui sera affichée dans le formulaire. Pour ce faire, utilisez le mot clé initial.

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

Voir la documentation Django Form pour plus d'explications.

Si vous essayez de modifier une valeur après la soumission du formulaire, vous pouvez utiliser quelque chose comme:

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

Consultez les documents référencés ci-dessus pour en savoir plus sur l'utilisation de cleaned_data

118
Grant

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

form = CustomForm()
form.fields["Email"].initial = GetEmailString()
83
Josh

Si vous souhaitez le faire dans la méthode __init__ du formulaire pour une raison quelconque, vous pouvez manipuler la variable 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'
8
seddonym

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

form = FormType(request.POST)
if request.method == "POST":
    formcopy = form(request.POST.copy())
    formcopy.data['Email'] = GetEmailString()
7
Milo P

Il suffit de changer votre champ Form.data:

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
2
ckarrie

Si vous avez initialisé le formulaire comme ceci

form = CustomForm()

ensuite, à compter de janvier 2019 , utilisez .initial pour remplacer les données. Cela remplacera les données du dict intial qui accompagne le formulaire. Cela fonctionne aussi si vous avez initialisé en utilisant une instance telle que form = CustomForm(instance=instance)

Pour remplacer les données du formulaire, vous devez

form.initial['Email'] = GetEmailString()

Généraliser cela serait,

form.initial['field_name'] = new_value
0
Vineeth Sai

Pour ajouter encore une autre solution, cela fonctionne aussi avec une notation un peu plus moderne. Cela fonctionne simplement autour du fait qu'une QueryDict est immuable.

>>> the_form.data = {**f.data.dict(), 'some_field': 47}
>>> the_form['some_field'].as_widget()
'<input type="hidden" name="some_field" value="47"
        class="field-some_field" id="id_some_field">'
0
dr. Sybren