Django自定义用户模型OTP登录后无法获取用户详情求助
问题分析与解决方案
核心问题拆解
- 模板语法错误:报错
Could not parse the remainder: '['member_id']' from 'request.POST.get['member']'是因为Django模板中调用方法必须使用括号(),而非方括号[];且登录后完全不需要通过POST/GET传递用户ID。 - 用户信息获取逻辑错误:登录成功后,Django会自动将当前用户实例存入
request.user,无需手动通过请求参数传递member_id。 - 视图函数写法错误:
society_admin_home中request.POST.get['member_id']是Python语法错误,get是方法,必须用括号调用。
具体修复步骤
1. 修正视图函数 society_admin_home
添加登录验证装饰器,直接通过request.user获取当前登录用户:
from django.contrib.auth.decorators import login_required @login_required(login_url='login') # 未登录自动跳转到登录页 def society_admin_home(request): # request.user 就是当前登录的 S_Society_Association_Master 实例 context = { 'current_member': request.user } return render(request, 'societyadmin/home.html', context)
2. 修正模板(home.html)中的用户信息调用
直接通过上下文传递的current_member或request.user访问用户属性:
<div class="user-info"> <h3>欢迎您,{{ current_member.member_name }}</h3> <p>会员ID:{{ current_member.member_id }}</p> <p>联系电话:{{ current_member.member_contact_number }}</p> <p>角色:{{ current_member.get_member_role_display }}</p> <!-- 显示角色的友好名称 --> </div>
3. 完善自定义用户模型配置
确保在项目的settings.py中指定自定义用户模型:
AUTH_USER_MODEL = 'your_app_name.S_Society_Association_Master' # 替换为你的实际APP名称
同时建议给自定义用户模型添加权限相关字段和管理器,避免后续权限问题:
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager class UserManager(BaseUserManager): def create_user(self, member_email_id, password=None, **extra_fields): if not member_email_id: raise ValueError('会员邮箱必须填写') user = self.model(member_email_id=self.normalize_email(member_email_id), **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, member_email_id, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(member_email_id, password, **extra_fields) class S_Society_Association_Master(AbstractBaseUser, PermissionsMixin): # 保留原有字段 is_staff = models.BooleanField(default=False) # 后台管理权限字段 is_active = models.BooleanField(default=True) objects = UserManager() # 添加用户管理器 USERNAME_FIELD = 'member_email_id'
4. 修正登录后的跳转逻辑
在login_otp视图中,OTP验证成功后应跳转到society_admin_home视图,而非直接渲染模板:
if otp == member.otp: member_row = S_Society_Association_Master.objects.get(member_id = member.member_id) login(request , member_row) return redirect('society_admin_home') # 改为跳转视图,而非直接渲染模板
额外注意事项
- 确保
login_attempt视图中,前端表单提交的手机号字段名是member_id,否则request.POST.get('member_id')会获取不到值。 - 自定义用户模型中的
password字段应配合set_password方法加密存储,避免明文存储密码。
内容的提问来源于stack exchange,提问作者Manu Vats
相关产品推荐
相关产品推荐

