Django表示不在验证时存储值失败

时间:2018-04-03 16:43:33

标签: python django

当验证失败时,我无法让Django保留输入的表单值。我创建了一个测试页面并使用了Django指南中的代码,它仍然无法正常工作。

来自Django guide

  

我们调用表单的is_valid()方法;如果它不是True,我们将返回带有表单的模板。这次表单不再为空(未绑定),因此HTML表单将填充先前提交的数据,可根据需要对其进行编辑和更正。

这是我的代码:

#views.py

def test(request):
    if request.method == 'POST':
        form = NewAwardForm(request.POST)

        if form.is_valid():
            return redirect('/test/')

    else:
        form = NewAwardForm()

    print(form)
    return render(request, 'test.html', {'form': form})
test.html

<form action="/test/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>
forms.py

class NewAwardForm(forms.Form):
    recipient_email = forms.EmailField(label='Recipient Email', max_length=100)

有人能发现我的错误吗?

1 个答案:

答案 0 :(得分:1)

Django使用type="email"呈现电子邮件字段。 HTML验证将阻止浏览器向服务器提交无效的电子邮件。

您可以通过向表单添加一个干净的方法来测试视图,该方法拒绝任何以&#34; example.com&#34;结尾的电子邮件。

class NewAwardForm(forms.Form):
    recipient_email = forms.EmailField(label='Recipient Email', max_length=100)

    def clean_recipient_email(self):
        if self.cleaned_data['recipient_email'].endswith('example.com'):
            raise forms.ValidationError("No example.org emails allowed")

现在,如果您输入hello@example.com并提交表单,HTML验证将允许提交请求,clean_recipient_email方法将引发验证错误,您将看到您的视图和模板按预期显示无效表单。