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. 处理数据库迁移
- 生成迁移文件:
python manage.py makemigrations
- 执行迁移时,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
相关产品推荐
相关产品推荐

