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

Django中判断登录用户是否为帖子作者:if-else判断不生效

问题解析与解决方案

一、user == post.author判断为False的原因

模板里的{{ user }}输出的是当前登录User对象的字符串表示(比如Admin),但post.author是你存在数据库里的字符串类型用户名。两者一个是对象、一个是字符串,本质类型不同,哪怕显示内容一致,比较结果也会是False。

打个比方:这就像拿User(username='Admin')这个对象和纯字符串'Admin'做对比,自然不相等。

二、改用ForeignKey的正确操作及报错解决

你想用ForeignKey替代CharField的思路是对的,这才是Django中关联用户的标准做法。报错是因为数据库仍保留着原author字段,而Django使用ForeignKey时会自动创建author_id字段(存储关联用户的ID),二者产生了冲突。

1. 修改Post模型

把原有的author字段替换为ForeignKey关联User模型:

from django.contrib.auth.models import User

class Post(models.Model):
    vote_count = models.IntegerField(default=0)
    id = models.BigAutoField(primary_key=True)
    created_at = models.DateField(default=date.today)
    title = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    tags = models.CharField(max_length=200)
    # 替换为ForeignKey
    author = models.ForeignKey(User, on_delete=models.CASCADE, default=None, null=True)

    def __str__(self):
        return str(self.id) + ' ' + self.title
  • on_delete=models.CASCADE表示关联用户被删除时,对应帖子也会被删除,可根据需求换成PROTECT等其他规则
  • 临时设置default=None, null=True是为了兼容已存在的帖子数据,后续可根据业务调整

2. 处理数据库迁移

  1. 生成迁移文件:
python manage.py makemigrations
  1. 执行迁移时,Django会提示你如何处理原author字段:可选择将原有字符串数据迁移到新关联字段,或直接删除原字段(根据数据重要程度选择)。若数据无保留价值,也可先删除旧author字段再执行迁移。

3. 修正模板判断逻辑

改用ForeignKey后,post.author会变成User对象,此时和模板里的user(User对象)比较就能正常生效:

{% if user == post.author %}
  <form action="DELETE">
    {% csrf_token %}
    <button type="submit" class="delete-btn" name="post-id" value="{{ post.id }}">Delete</button>
  </form>
  <a href=""><button class="edit-btn">Edit</button></a>
{% endif %}

临时替代方案(不推荐长期使用)

如果暂时不想修改模型,也可以通过比较用户名的字符串来实现判断:

{% if user.username == post.author %}
  <!-- 删除、编辑按钮代码 -->
{% endif %}

但这种做法不符合Django最佳实践,后续若涉及用户修改用户名等场景会出现问题,还是推荐使用ForeignKey关联用户。

内容的提问来源于stack exchange,提问作者Lenni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:10:16