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

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模型:

  1. 在你的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)
  1. 在settings.py中指定自定义用户模型:
AUTH_USER_MODEL = 'your_app_name.CustomUser'
  1. 执行迁移命令:
python manage.py makemigrations
python manage.py migrate
  1. 最后调整表单的Meta类,将model改为CustomUser即可。

内容的提问来源于stack exchange,提问作者Franciszek Job

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 03:42:33