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 pouvoir faire quelque chose comme ceci:

 form = CustomForm() form["Email"] = GetEmailSsortingng() return HttpResponse(t.render(c)) 

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 faites cela est avec le mot-clé initial .

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

Voir la documentation de Django Form pour plus d’explications.

Si vous essayez de modifier une valeur après l’envoi du formulaire, vous pouvez utiliser quelque chose comme:

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

Consultez les documents référencés ci-dessus pour plus d’informations sur l’utilisation de cleaned_data

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 = GetEmailSsortingng() 

Quelque chose comme Nigel Cohen fonctionnerait si vous ajoutiez des données à une copie du jeu de données de formulaire collecté:

 form = FormType(request.POST) if request.method == "POST": formcopy = form(request.POST.copy()) formcopy.data['Email'] = GetEmailSsortingng() 

Si vous voulez le faire avec la méthode __init__ du __init__ 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' 

Changez simplement 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 

Une autre façon de faire, si vous avez déjà initialisé un formulaire (avec ou sans données), et que vous devez append des données supplémentaires avant de l’afficher:

 form.data['Email] = GetEmailSsortingng()