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))
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
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()
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()
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'
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
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()