Django中request.user与winning_user相等判断失效问题排查
问题分析与解决方法
问题根源
你打印出来的都是"Test2",但两者类型完全不同:
request.user是Django自带的User模型实例对象winning_user是你存在数据库里的字符串(因为模型里定义的是models.CharField)
对象和字符串直接用==比较,结果必然是False,哪怕它们的字符串表现形式一样。
解决方法
方法一:修改模型(推荐,符合Django最佳实践)
把InactiveListing里的winning_user字段改成关联User模型的外键,这样存储的是用户对象的引用,比较更准确:
from django.contrib.auth.models import User class InactiveListing(models.Model): title = models.CharField(max_length=64) description = models.CharField(max_length=512, default="") # 改成ForeignKey关联User winning_user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) winning_price = models.DecimalField(max_digits=6, decimal_places=2, default=0.01) def __str__(self): return self.title
修改模型后,记得执行数据库迁移:
python manage.py makemigrations python manage.py migrate
视图里的判断可以保持原来的if request.user == winning_user:,因为现在两者都是User对象了。
方法二:临时修复(不修改模型)
如果暂时不想改动模型,直接比较用户的用户名字符串:
把视图里的判断语句改成:
if request.user.username == winning_user: print("This is good") message = "You have won this listing!" else: print("Not good")
这样就是字符串和字符串比较,就能得到正确的结果了。
内容的提问来源于stack exchange,提问作者Annelotte
相关产品推荐
相关产品推荐

