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

时间:2019-02-02 06:56:20

标签: python django django-models django-users

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

1 个答案:

答案 0 :(得分:1)

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

您可以通过创建AbstractUser扩展用户模型,也可以创建自己的名为“ 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")

然后创建该人将在注册期间填写的表格。这将是“用户模型”表格和您的自定义“个人资料”表格。

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'}),
        }

然后,当他完成注册后,您需要将两个表单的数据保存到User实例。我正在使用此方法:

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})

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

希望有帮助。