You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

额外的优化小建议

  1. 模型类名建议改成Comment(单数形式,符合Django的模型命名规范,看起来更专业)
  2. 你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:59:07