Django устанавливает значение поля после инициализации формы - PullRequest
99 голосов
/ 02 мая 2009

Я пытаюсь установить для поля определенное значение после инициализации формы.

Например, у меня есть следующий класс.

class CustomForm(forms.Form):
    Email = forms.EmailField(min_length=1, max_length=200)

По-моему, я хочу иметь возможность сделать что-то вроде этого:

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

return HttpResponse(t.render(c))

Ответы [ 8 ]

120 голосов
/ 02 мая 2009

Поскольку вы не передаете данные POST, я предполагаю, что вы пытаетесь установить начальное значение, которое будет отображаться в форме. Вы делаете это с помощью ключевого слова initial.

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

Более подробное объяснение см. В документах Django Form .

Если вы пытаетесь изменить значение после отправки формы, вы можете использовать что-то вроде:

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

Проверьте вышеупомянутые документы, чтобы узнать больше об использовании cleaned_data

85 голосов
/ 25 мая 2012

Если вы уже инициализировали форму, вы можете использовать начальное свойство поля. Например,

form = CustomForm()
form.fields["Email"].initial = GetEmailString()
8 голосов
/ 25 августа 2015

Если по какой-то причине вы хотите сделать это в методе __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'
7 голосов
/ 27 ноября 2013

Что-то вроде Найджела Коэна сработало бы, если бы вы добавляли данные в копию собранного набора данных формы:

form = FormType(request.POST)
if request.method == "POST":
    formcopy = form(request.POST.copy())
    formcopy.data['Email'] = GetEmailString()
2 голосов
/ 22 сентября 2016

Просто измените ваше поле 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
0 голосов
/ 24 января 2019

Если вы инициализировали форму, как эта

form = CustomForm()

тогда правильный путь с января 2019 заключается в использовании .initial для замены данных. Это заменит данные в тексте intial, который идет вместе с формой. Это также работает, если вы инициализировали, используя некоторый экземпляр, такой как form = CustomForm(instance=instance)

Чтобы заменить данные в форме, вам нужно

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

Обобщая это было бы,

form.initial['field_name'] = new_value
0 голосов
/ 01 ноября 2018

Чтобы добавить еще один путь в микс: это тоже работает, с немного более современными обозначениями. Это просто работает вокруг факта, что 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">'
0 голосов
/ 04 апреля 2011

Другой способ сделать это, если вы уже инициализировали форму (с данными или без данных) и вам необходимо добавить дополнительные данные перед их отображением:

form = Form(request.POST.form)
form.data['Email'] = GetEmailString()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...