如何在一页显示多个Django消息?

2 投票
2 回答
5185 浏览
提问于 2025-04-17 16:43

在我的主页上,有一个登录表单和一个注册表单,我使用form.is_valid()来验证表单。

但是,我并不是用

return render(request,'registration/login.html', {'form': form})

而是用

messages.error(request, 'username or password wrong.')
return redirect('/')

这样做的原因是,在

return render(request,'registration/login.html', {'form': form})

当form.is_valid()验证失败后,如果刷新页面,会弹出一个提示框,询问是否要重新提交,我不想要这个,所以我使用了第二种方法。

现在的问题是,因为有两个表单:登录和注册,我不能把错误信息放在一个地方,这样会让人困惑。那么,如何在一个页面上显示两个错误信息呢?

2 个回答

0

你可以使用 form.errors 这个字典,它会存储字段名称和错误信息,特别是在表单无效的情况下,比如:

>>> print form.errors
{'password': [u'This field is required']}

然后你可以在你的模板中使用:

{% if 'username' in form.errors.keys %}
    <div class="error-message">
        Your username input error message!
    </div>
{% endif %}
{% if 'password' in form.errors.keys %}
    <div class="error-message">
        Your password input error message!
    </div>
{% endif %}

我看到的唯一问题是输出的消息,看起来有点丑 =] 但你可以用其他方法让它更好看,比如使用其他字典来存储更好看的消息,然后通过字段名称来获取这些消息……这个选择在你。

*抱歉我的英语不好 ;/

9

你可以使用 extra_tags 来区分来自消息框架的两种不同消息。

比如说,对于登录错误,

messages.error(request, 'username or password wrong.', extra_tags='login')

对于注册错误,

messages.error(request, 'username or password wrong.', extra_tags='signup')

然后在模板中,根据标签把消息放到合适的地方。

{# login form #}
{%for message in messages %}
     {%if "login" in message.tags %}
          <p> {{message}} </p>   {# show login error message #}
     {%endif%}
{%endfor%}

{# signup form #}
{%for message in messages %}
     {%if "signup" in message.tags %}
          <p> {{message}} </p>   {# show signup error message #}
     {%endif%}
{%endfor%}

更多信息可以参考 添加额外消息标签

撰写回答