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

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

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

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

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

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

return HttpResponse(t.render(c))

6 ответов


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

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

посмотреть Django форма документы для получения дополнительных объяснений.

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

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

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


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

form = CustomForm()
form.fields["Email"].initial = GetEmailString()

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

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

Если вы хотите сделать это в форме __init__ метод по какой-то причине, вы можете манипулировать 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'

просто измените форму.поле данных:

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

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

form.data['Email] = GetEmailString()