Django模板中{% if %}{% else %}条件判断失效,无法区分当前用户评论问题求助
问题排查与修复方案
嘿,我一眼就发现你条件判断失效的原因啦!
核心问题:类型不匹配导致判断永远不成立
你模板里写的{% if comment.commented_by == user.username %}犯了一个典型的类型错误:
comment.commented_by是完整的User模型对象(因为你在models里定义的是ForeignKey(get_user_model()),关联的是用户对象)user.username只是字符串类型的用户名
这俩完全不是同一类东西,就像拿苹果和苹果的名字比,肯定永远不相等,所以条件永远走else分支。
两种快速修正方案
选其中一种就能解决问题:
方案1:直接比较用户对象(推荐)
这是最准确的方式,直接拿评论的作者对象和当前登录用户对象对比:
<div> <div class="commentsContainer"> {% for comment in comments %} {% if comment.commented_by == user %} <h4>YOU</h4> {% else %} {{ comment.commented_by.username }} {% endif %} <div class="comment"> {{ comment }} </div> {% endfor %} </div> </div>
小提醒:我把else分支的
{{comment.commented_by}}改成了{{comment.commented_by.username}},这样只会显示用户名,避免出现类似User object (1)的奇怪默认字符串。
方案2:比较用户名属性
如果你非要用用户名字符串来比,那两边都得取用户名属性:
<div> <div class="commentsContainer"> {% for comment in comments %} {% if comment.commented_by.username == user.username %} <h4>YOU</h4> {% else %} {{ comment.commented_by.username }} {% endif %} <div class="comment"> {{ comment }} </div> {% endfor %} </div> </div>
额外的优化小建议
- 模型类名建议改成
Comment(单数形式,符合Django的模型命名规范,看起来更专业) - 你的
Comment视图类继承顺序有问题:LoginRequiredMixin要放在CreateView前面,否则登录验证可能不生效。正确写法是:
class Comment(LoginRequiredMixin, CreateView): form_class = CommentForm template_name = 'app/comments.html' login_url = 'login' success_url = reverse_lazy('comments') # ... 其他代码不变
因为Django的Mixin是按继承顺序执行逻辑的,权限验证类得优先触发才行。
内容的提问来源于stack exchange,提问作者TobaSko
相关产品推荐
相关产品推荐

