django表单错误消息未显示

时间:2013-09-22 17:32:09

标签: django django-models django-forms django-templates django-errors

所以我有我的观点:

def home_page(request):
    form = UsersForm()
    if request.method == "POST":
        form = UsersForm(request.POST)

        if form.is_valid():
            form.save()
    c = {}
    c.update(csrf(request))
    c.update({'form':form})
    return render_to_response('home_page.html', c)

my forms.py:

class UsersForm(forms.ModelForm):

    class Meta:
        model = Users
        widgets = {'password':forms.PasswordInput()}

    def __init__(self, *args, **kwargs):
        super( UsersForm, self ).__init__(*args, **kwargs)
        self.fields[ 'first_name' ].widget.attrs[ 'placeholder' ]="First Name"  
        self.fields[ 'last_name' ].widget.attrs[ 'placeholder' ]="Last Name"
        self.fields[ 'password' ].widget.attrs[ 'placeholder' ]="Password"

和我的模板:

<html>
    <body>

    <form method="post" action="">{% csrf_token %}
        {{ form.first_name }} {{form.last_name }} <br>
        {{ form.password }} <br>
        <input type="submit" value="Submit Form"/>
    </form>

    {% if form.errors %}
        {% for field in form %}
        {% for error in field.errors %}
            <p> {{ errors }} </p>
        {% endfor %}
        {% endfor %}
        {% for error in form.non_field_errors %}
        <p> {{ error }} </p>
        {% endfor %}
    {% endif %}

    </body>
</html>

现在,请记住,在分割表单字段之前,我的表单看起来像这样:

    <form method="post" action="">{% csrf_token %}
            {{ form }}
        <input type="submit" value="Submit Form"/>
    </form>

如果表单有问题(如果其中一个字段丢失),它会自动给出错误消息。在我分割模板中的表单字段({{form.first_name}},{{form.last_name}}和{{form.password}}自己的部分)后,它会自动停止提供错误消息。这是正常的吗?

但主要问题是,如果有错误消息,我的{{if form.errors}}语句怎么没有工作/显示错误消息?例如,如果我故意不填写表单中的字段并单击提交,则数据库不会获得更新(这是一件好事)但它不会给出任何错误消息。知道为什么吗?

我也尝试删除{{forms.non_field_errors}}并尝试返回字段错误,如下所示:

    {% if form.errors %}
        {% for field in form %}
        {% for error in field.errors %}
            <p> {{ errors }} </p>
        {% endfor %}
        {% endfor %}
    {% endif %}

但它仍然不起作用。

4 个答案:

答案 0 :(得分:3)

我发现了错误(拼写错误)。

该代码段应为:

{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <p> {{ error }} </p>
        {% endfor %}
    {% endfor %}
{% endif %}

我有errors而不是error

答案 1 :(得分:3)

像这样在views.py中添加这个片段

if request.method == "POST":
    fm = UserRegsitrationForm(request.POST)
    if fm.is_valid():
        fm.save()

    else:
        fm = UserRegsitrationForm()
    context = {'fm':fm}
    return render(request,'registration.html',context)

答案 2 :(得分:1)

如果is_valid()不正确,则必须再次发送表单上下文,

    if form.is_valid():

        return redirect('/user/contact/')
    else:
        return render(request, 'users/contact.html', context={'form': form})

因为您的错误将显示在您的表单中 否则:它将返回ValueError

答案 3 :(得分:0)

错误捕获完全可以通过以下方式完成:

{% for field in form %}
    {{ field.errors }}
{% endfor %}