Django普通User模型扩展:添加first_name和last_name字段并在注册表单中实现的方法
解决方法:利用Django默认User模型自带字段,无需额外扩展模型
首先要告诉你一个好消息:Django的User默认模型已经内置了first_name和last_name字段,你完全不需要额外扩展模型!你之前在表单里自定义的name和surname其实是多余的,只需要调整表单代码即可实现需求。
步骤1:修正你的注册表单
把表单里自定义的name和surname替换为模型自带的first_name和last_name,同时调整字段配置和Meta类:
from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User from django import forms class UserRegisterForm(UserCreationForm): def __init__(self, *args, **kwargs): super(UserRegisterForm, self).__init__(*args, **kwargs) self.fields['password1'].label = "Hasło" self.fields['password2'].label = "Powtórz hasło" email = forms.EmailField() # 替换自定义字段为模型原生的first_name、last_name first_name = forms.CharField( label="Imię", required=True, max_length=30, ) last_name = forms.CharField( label="Nazwisko", required=True, max_length=30, ) class Meta: model = User # 更新字段列表,去掉name和surname,加入first_name、last_name fields = ['username', 'first_name', 'last_name', 'email', 'password1', 'password2'] labels = { 'username': 'Nazwa użytkownika', }
步骤2:你的视图代码无需修改
你现有的注册视图代码完全可以直接使用!当form.is_valid()通过后,form.save()会自动将first_name和last_name的值存入默认的User模型中——因为这两个字段是模型原生字段,表单会自动处理它们的保存逻辑。
步骤3:Crispy Forms自动适配
如果你在模板中使用Crispy Forms渲染表单(比如用{% crispy form %}),它会自动识别新增的first_name和last_name字段并渲染出来,不需要额外配置。如果需要调整字段布局,可以在表单中添加Crispy的Layout配置,比如:
from crispy_forms.helper import FormHelper from crispy_forms.layout import Layout, Fieldset, Row, Column class UserRegisterForm(UserCreationForm): # ... 保留之前的字段和__init__代码 ... def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.helper = FormHelper() self.helper.layout = Layout( Fieldset( 'Dane użytkownika', Row( Column('username', css_class='form-group col-md-6 mb-0'), Column('email', css_class='form-group col-md-6 mb-0'), css_class='form-row' ), Row( Column('first_name', css_class='form-group col-md-6 mb-0'), Column('last_name', css_class='form-group col-md-6 mb-0'), css_class='form-row' ), 'password1', 'password2', ) )
可选:如果需要数据库层面强制必填
如果你希望在数据库层面让first_name和last_name成为必填字段(默认它们是可选的,blank=True),那你需要扩展默认User模型:
- 在你的app中创建自定义User模型:
from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): first_name = models.CharField("Imię", max_length=150, blank=False) last_name = models.CharField("Nazwisko", max_length=150, blank=False)
- 在
settings.py中指定自定义用户模型:
AUTH_USER_MODEL = 'your_app_name.CustomUser'
- 执行迁移命令:
python manage.py makemigrations python manage.py migrate
- 最后调整表单的
Meta类,将model改为CustomUser即可。
内容的提问来源于stack exchange,提问作者Franciszek Job
相关产品推荐
相关产品推荐

