首页 > 解决方案 > 将字段添加到 django 内置的注册表单

问题描述

我正在尝试在我的 django 项目中创建一个自定义注册表单,但我仍然想使用from django.contrib.auth.forms import UserCreationForm它已经有一些内置字段。我已经创建了一个添加字段的表单,但我不知道如何将其添加到模型

from django import forms 
from django.contrib.auth.forms. import UserCreation
from django.contrib.auth.models import User

class SignUpForm(UserCreationForm):
    email = forms.CharField(max_length=254, required=True, widget=forms.EmailInput())
    teamNumber = forms.CharField(max_length=4, required=True)

    class Meta:
        Model = User
        fields= ('username', 'email', 'teamNumber', 'password1', 'password2')

我曾尝试使用 abstractUser 但这导致了错误的混合。

标签: djangopython-3.x

解决方案


您可以使用一对一的链接方法来实现这一点,您需要做的是创建带有附加字段的新模型(例如“配置文件”),并将该模型与内置用户模型一对一地链接。

class Profile(models.Model):
    #one-to-one link with built-in model
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    #additional fields
    email = forms.CharField(max_length=254, required=True, widget=forms.EmailInput())
    teamNumber = forms.CharField(max_length=4, required=True)

这链接了两个模型,但您仍然必须定义两个信号(在同一个 model.py 文件中)才能使模型工作,

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

这些信号在创建和更新内置用户模型时创建和保存配置文件条目。

此外,您无需创建自己的电子邮件字段,因为内置用户模型已经有一个电子邮件字段,请确保您检查它:)

注意:还有其他方法可以实现这一点,但我个人更喜欢这种方法而不是其他两种方法(在下面的链接中提到),因为它更清洁、更易于维护和思考。

一定要看看这个关于扩展 Django 内置用户模型的很棒的博客: 链接 那里的作者很好地解释了所有三种方法以及它们是如何工作的。


推荐阅读