Я пытаюсь установить поле в определенное значение после того, как форма будет инициализирована.
Например, у меня есть следующий класс.
class CustomForm(forms.Form):
Email = forms.EmailField(min_length=1, max_length=200)
В представлении я хочу иметь возможность сделать что-то вроде этого:
form = CustomForm()
form["Email"] = GetEmailString()
return HttpResponse(t.render(c))
Ответ 1
Поскольку вы не передаете данные POST, я предполагаю, что то, что вы пытаетесь сделать, это установить начальное значение, которое будет отображаться в форме. Как вы это делаете, это ключевое слово initial
.
form = CustomForm(initial={'Email': GetEmailString()})
Подробнее см. Django Form docs.
Если вы пытаетесь изменить значение после отправки формы, вы можете использовать что-то вроде:
if form.is_valid():
form.cleaned_data['Email'] = GetEmailString()
Проверьте приведенные выше документы, чтобы больше узнать об использовании cleaned_data
Ответ 2
Если вы уже инициализировали форму, вы можете использовать начальное свойство поля. Например,
form = CustomForm()
form.fields["Email"].initial = GetEmailString()
Ответ 3
Если вы хотите сделать это в форме __init__
по какой-либо причине, вы можете манипулировать initial
dict:
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'
Ответ 4
Что-то вроде Найджела Коэна будет работать, если вы добавите данные в копию собранного набора данных формы:
form = FormType(request.POST)
if request.method == "POST":
formcopy = form(request.POST.copy())
formcopy.data['Email'] = GetEmailString()
Ответ 5
Просто измените поле 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
Ответ 6
Чтобы добавить еще один путь к миксу: это тоже работает, с немного более современными обозначениями. Это просто работает вокруг факта, что QueryDict
является неизменным.
>>> 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">'
Ответ 7
Если вы инициализировали форму, как это
form = CustomForm()
тогда правильный путь с января 2019 года - использовать .initial
для замены данных. Это заменит данные в intial
тексте, который сопровождает форму. Это также работает, если вы инициализировали, используя некоторый экземпляр, такой как form = CustomForm(instance=instance)
Чтобы заменить данные в форме, вам необходимо
form.initial['Email'] = GetEmailString()
Обобщая это было бы,
form.initial['field_name'] = new_value
Ответ 8
Другой способ сделать это, если вы уже инициализировали форму (с данными или без данных), и вам необходимо добавить дополнительные данные перед их отображением:
form = Form(request.POST.form)
form.data['Email'] = GetEmailString()