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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:35:25