Django模板判断messages内容的if条件未按预期执行
问题根因
判断失效的原因非常简单:Django messages框架在循环中输出的message是框架封装的Message实例对象,不是原生字符串。你直接拿实例对象和"password not strong enough"字符串做等值比较,结果永远为False,所以永远走else分支渲染默认文本。
修复方案
只需要把判断条件里的message替换成message.message,取实例存储的实际文本内容做比较即可,修正后的模板代码如下:
{% if messages %} {% for message in messages %} {% if message.message == "password not strong enough" %} <div class="alert alert-danger alert-dismissible fade show" style="margin-bottom: 0; font-size: 13px; margin-top: 0;" role="alert"> <p style="margin-top: 0; margin-bottom: 0rem; text-align: center;"> 密码强度不足,新密码需满足以下规则: <li>长度为8-16位</li> <li>包含至少1个数字</li> <li>包含至少1个小写字母和1个大写字母</li> <li>包含至少1个特殊字符,支持范围:[@#(/)+]</li> </p> <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> {% else %} <div class="alert alert-danger alert-dismissible fade show" style="margin-bottom: 0; font-size: 13px; margin-top: 0;" role="alert"> <p style="margin-top: 0; margin-bottom: 0rem; text-align: center;" {% if message.tags %}class="{{ message.tags }}"{% endif %}> {{ message }} </p> <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> {% endif %} {% endfor %} {% endif %}
*注:你原代码else分支里的{% if message.tags %} {% endif %}是空逻辑,以上代码已经顺手补全为给p标签绑定对应样式类的逻辑,否则消息自带的级别标签不会生效。
更稳妥的优化写法
不推荐在模板里硬匹配字符串,后续如果修改views里的提示文本,模板判断会直接失效。可以借助messages的extra_tags参数做标记,耦合度更低:
- 修改views中密码强度不足的消息逻辑,增加自定义标签:
if not complex_pass(password): messages.warning(request, "password not strong enough", extra_tags="weak_password") - 模板中改为判断标签是否存在:
{% if "weak_password" in message.tags %} {# 此处放密码规则自定义提示代码 #} {% endif %}
后续不管怎么修改提示文案,只要标签不变,模板逻辑就不会出问题。
内容的提问来源于stack exchange,提问作者abhishek surela
相关产品推荐
相关产品推荐

