如何在 Django 用户模型中添加新字段

Sty*_*xin 5 python django django-models django-users

如何在 django 用户模型中添加新字段。django 用户模型带有标准的用户名电子邮件和密码,但是我希望用户有更多与他们的帐户相关联的详细信息,例如电话号码或其他内容。什么是最好的方法来做到这一点?

Lex*_*lov 6

有几种方法可以做到这一点。您可以在官方文档中阅读所有这些内容。在这里

您可以通过创建 AbstractUser 来扩展 User 模型,也可以创建您自己的名为“Profile”的模型(例如),它以这种方式链接到 User 实例:

models.py
class Profile(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE)
   phonenumber = models.CharField(verbose_name="phone number", max_lenght=10)
   birthdate = models.DateField(verbose_name="birth date")
Run Code Online (Sandbox Code Playgroud)

然后您创建该人将在注册期间填写的表格。它将是用户模型表单和您的自定义配置文件表单。

forms.py
class UserForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'first_name', 'email', 'password1', 'password2']


class ProfileForm(forms.ModelForm):

    class Meta:
        model = Profile
        fields = ['birthdate', 'phonenumber']
        widgets = {
            'birthdate': DateInput(attrs={'type': 'date'}),
        }
Run Code Online (Sandbox Code Playgroud)

那么你需要在他完成注册时将两个表单的数据保存到用户实例中。我正在使用这个方法:

views.py
def register(request):
    if request.method == "POST":
        u_form = UserForm(request.POST)
        p_form = ProfileForm(request.POST)
        if u_form.is_valid() and p_form.is_valid():
            user = u_form.save()
            p_form = p_form.save(commit=False)
            p_form.user = user
            p_form.save()
            messages.success(request, f'Registration complete! You may log in!')
            return redirect('login')
    else:
        u_form = UserForm(request.POST)
        p_form = ProfileForm(request.POST)
    return render(request, 'users/register.html', {'u_form': u_form, 'p_form': p_form})
Run Code Online (Sandbox Code Playgroud)

因此,当人们进入注册页面时,他/她会看到 2 个表单,用户表单和个人资料表单,需要填写它们才能通过注册。当提交按钮被按下时(发布请求)视图检查所有数据是否正确,并创建具有标准字段的用户配置文件和自定义配置文件实例,其中包含链接到该用户并可访问的所需附加字段(例如 User.profile.birthdate)。

希望有帮助。