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