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

Django获取交易数据时出现AnonymousUser错误的问题排查

Django获取交易数据出现AnonymousUser错误的解决办法

问题分析

你遇到的AnonymousUser错误,核心原因有两个:

  1. 视图未做登录校验,未登录用户也能访问,导致request.user为匿名用户
  2. 自定义的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:43:24