Django模板中res_person_1_username与user比较恒为False问题排查
问题原因
你遇到的判断失效问题本质是数据类型不匹配:
object.res_person_1_username是你在模型中定义的TextField类型,存储的是纯字符串格式的用户名- 模板上下文中的
user是Django认证系统生成的User模型实例对象,不是纯字符串
你看到打印出来的值一致,是因为Django模板输出User实例时,默认调用了实例的__str__方法,绝大多数场景下User类的__str__返回值就是用户的用户名字符串,所以观感上两者值相同,但实际类型完全不一样,直接做相等判断必然返回False。
而object.author == user能判断成功,说明你的author字段是关联User表的外键字段,object.author本身也是User实例,同类型的模型实例会按主键判断是否相等,逻辑自然成立。
解决方法
临时修复(无需改模型)
直接修改模板中的判断逻辑,取User实例的username属性做字符串对比即可:
{% if object.author == user or object.res_person_1_username == user.username %}
长期优化(推荐)
如果你后续需要频繁对res_person_1做用户关联判断、查询,更推荐调整模型字段类型,改为外键关联User表,避免存冗余的用户名字段,也能避免后续用户名修改后数据不一致的问题:
# models.py 修改后 from django.contrib.auth import get_user_model User = get_user_model() # 替换原有res_person_1_username字段 res_person_1 = models.ForeignKey( User, on_delete=models.SET_NULL, blank=True, null=True, related_name='res_person_1_records' )
修改后模板判断可以保持和author一致的逻辑:
{% if object.author == user or object.res_person_1 == user %}
内容的提问来源于stack exchange,提问作者MarkoZg
相关产品推荐
相关产品推荐

