Django中如何在页面及数据库正确显示first_name与last_name
Django + allauth实现HOD注册:first_name/last_name无法存储及显示问题
在使用Django结合allauth实现HOD注册功能时,页面无法正确显示用户姓名,同时数据库中的first_name和last_name字段也无法正常存储。
相关代码
views.py
from allauth.account.views import SignupView from .forms import HODSignUpForm class HodSignUp(SignupView): template_name = 'account/signup.html' form_class = HODSignUpForm redirect_field_name = '' view_name = 'hod_sign_up' def get_context_data(self, **kwargs): ret = super(HodSignUp, self).get_context_data(**kwargs) ret.update(self.kwargs) return ret
forms.py
from .models import Admin from po.models import User from allauth.account.forms import SignupForm class HODSignUpForm(SignupForm): first_name=forms.CharField(required=False) last_name=forms.CharField(required=False) class Meta: model= Admin fields = ['first_name','last_name'] def save(self,request): user = super(HODSignUpForm, self).save(request) user.is_hod = True user= User(first_name=self.cleaned_data.get('first_name'), last_name=self.cleaned_data.get('last_name')) user.save() return user
models.py
from po.models import User class Admin(models.Model): user = models.ForeignKey(User, blank=True, null=True, on_delete=models.SET_NULL) first_name = models.CharField(max_length=30, db_column='first_name') last_name = models.CharField(max_length=30, db_column='last_name')
po/models.py
from django.contrib.auth.models import AbstractUser class User(AbstractUser): is_active = models.BooleanField(default=True) is_hod= models.BooleanField(default=False) first_name = models.CharField(null=True, max_length=50) last_name=models.CharField(null=True, max_length=50)
admin.py
from po.models import User class Schooladmin(admin.ModelAdmin): list_display = ("id","is_active","is_hod","first_name","last_name") list_filter = ("is_active","is_hod") add_fieldsets = ( ('Personal Info', { 'fields': ('first_name', 'last_name') }), ) admin.site.register(User,Schooladmin)
问题现象
- 页面未正确显示用户姓名
- 数据库中
first_name和last_name字段为空
修复方案
1. 修正forms.py核心逻辑
你的save方法错误地重新创建了User对象,覆盖了allauth生成的原始用户,导致姓名和权限设置失效。同时修复Meta类缩进问题:
from .models import Admin from po.models import User from allauth.account.forms import SignupForm import forms # 补充缺失的forms模块导入 class HODSignUpForm(SignupForm): first_name = forms.CharField(required=False) last_name = forms.CharField(required=False) # 将Meta类缩进至Form类内部 class Meta: model = Admin fields = ['first_name', 'last_name'] def save(self, request): # 保留allauth创建的原始用户对象 user = super(HODSignUpForm, self).save(request) # 直接修改该用户的属性 user.is_hod = True user.first_name = self.cleaned_data.get('first_name') user.last_name = self.cleaned_data.get('last_name') user.save() # 保存修改 # 若需要关联Admin模型,创建对应实例 Admin.objects.create( user=user, first_name=self.cleaned_data.get('first_name'), last_name=self.cleaned_data.get('last_name') ) return user
2. 清理User模型冗余字段
AbstractUser自带first_name和last_name,重复定义会导致字段冲突,删除冗余定义:
from django.contrib.auth.models import AbstractUser class User(AbstractUser): is_active = models.BooleanField(default=True) is_hod = models.BooleanField(default=False) # 移除重复的first_name、last_name字段
3. 修正模板显示逻辑
在前端模板中,通过正确的用户属性调用姓名:
<!-- 直接调用User模型的姓名字段 --> {{ user.first_name }} {{ user.last_name }} <!-- 若需调用Admin模型的姓名 --> {{ user.admin.first_name }} {{ user.admin.last_name }}
4. 完善admin后台配置
补充用户创建时的必填字段(如用户名、邮箱):
from po.models import User from django.contrib import admin class Schooladmin(admin.ModelAdmin): list_display = ("id", "username", "email", "is_active", "is_hod", "first_name", "last_name") list_filter = ("is_active", "is_hod") add_fieldsets = ( ('Personal Info', { 'fields': ('first_name', 'last_name') }), ('Account Info', { 'fields': ('username', 'email', 'password1', 'password2') }), ('Permissions', { 'fields': ('is_active', 'is_hod') }), ) admin.site.register(User, Schooladmin)
内容的提问来源于stack exchange,提问作者users
相关产品推荐
相关产品推荐

