用户模型 Django 中的自定义字段

Custom fields in user model Django

我在 Django 中使用普通用户模型来保存我的用户。我想添加 first_name 和 last_name 字段,但我不知道如何扩展我的模型并使其工作。名字和姓氏应该在注册表中添加(我使用脆皮形式)。

注册查看


    if request.method == "POST":
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()  # save user to database
            username = form.cleaned_data.get('username')
            messages.success(request, f"User {username} succesfully created! You can login now!")
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

注册表

    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()
    name = forms.CharField(
        label="Imię",
        required=True,
        max_length=30,
    )
    surname = forms.CharField(
        label="Nazwisko",
        required=True,
        max_length=30,
    )

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2', 'name', 'surname']
        labels = {
            'username': 'Nazwa użytkownika',
        }

Django 的 User model [Django-doc] 已经有 first_namelast_name,您可以子类化 UserCreationForm 并为 first_name 和 [=12= 添加字段]:

from django.contrib.auth.forms import UserCreationForm

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()
    <b>first_name</b> = forms.CharField(
        label='Imię',
        required=True,
        max_length=30,
    )
    <b>last_name</b> = forms.CharField(
        label='Nazwisko',
        required=True,
        max_length=30,
    )

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2'<b>, 'first_name', 'last_name'</b>]
        labels = {
            'username': 'Nazwa użytkownika',
        }