Django获取交易数据时出现AnonymousUser错误的问题排查
Django获取交易数据出现AnonymousUser错误的解决办法
问题分析
你遇到的AnonymousUser错误,核心原因有两个:
- 视图未做登录校验,未登录用户也能访问,导致
request.user为匿名用户 - 自定义的
User模型未集成Django认证系统,登录后的request.user和你的自定义User实例不匹配,无法关联查询交易数据
解决方案
1. 给视图添加登录保护
用Django自带的@login_required装饰器,确保只有登录用户能访问该视图:
from django.contrib.auth.decorators import login_required @login_required def view_transaction(request): print(request.user) user_transactions = Transactions.objects.filter(user_account = request.user) return render(request,'transactions.html',{'user_transactions':user_transactions})
2. 修复自定义User模型,集成Django认证系统
你的User模型直接继承models.Model,无法被Django认证系统识别,需要修改为继承AbstractBaseUser,并配置用户管理器:
from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager # 定义用户管理器,处理用户创建逻辑 class UserManager(BaseUserManager): def create_user(self, user_id, password=None, **extra_fields): if not user_id: raise ValueError('必须填写user_id') user = self.model(user_id=user_id, **extra_fields) user.set_password(password) # 使用Django加密方法存储密码 user.save(using=self._db) return user def create_superuser(self, user_id, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(user_id, password, **extra_fields) # 修改User模型继承AbstractBaseUser class User(AbstractBaseUser): name = models.CharField(max_length=45) phone = models.CharField(max_length=45) account_number = models.CharField(max_length=45, primary_key=True, blank=False, unique=True) user_id = models.CharField(max_length=45, unique=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) # 指定user_id作为登录的唯一标识 USERNAME_FIELD = 'user_id' objects = UserManager() def __str__(self): return self.name
3. 在settings.py中配置自定义User模型
告诉Django使用你的自定义User模型作为认证用户:
# 替换成你的应用名,比如你的app叫'bank'就写'bank.User' AUTH_USER_MODEL = '你的应用名.User'
4. 注意事项
- 移除原
User模型中的password和confirm_password字段,AbstractBaseUser已内置加密密码字段,确认密码的逻辑放在注册表单中处理 - 如果已经执行过数据库迁移,修改模型后需要重新迁移(生产环境请先备份数据)
- 登录逻辑必须使用Django认证系统的
authenticate()和login()方法,确保登录后request.user是正确的自定义User实例
内容的提问来源于stack exchange,提问作者Bruce_Wayne
相关产品推荐
相关产品推荐

