如何从内置身份验证实现的用户表单中保存数据。用户在 Django 中使用 UserCreationForm?

How to save data from the User form that is implemented by built-in auth. User using UserCreationForm in Django?

您好,我是 Django 的新手,我创建了一个 login/logout 模型 Django 内置用户和 UserCreationForm。它工作正常,但我的问题是我在我的表单中定义了两个自定义输入,当我 运行 服务器时它显示在网页上但是当我在管理员下检查用户时,我只看到详细信息用户定义的字段不是我的自定义字段。

如何将它的数据保存到我的用户模型中? 或者如果我错误地定义了自定义字段,我该如何更改它以便我可以将它的数据保存在我的模型中。

我的自定义字段(地址和 phone 号码未显示在管理员用户中,其数据未保存。

model.py

from django.db import models
from django.contrib import auth
# Create your models here.
class User(auth.models.User,auth.models.PermissionsMixin):

    def __str__(self):
        return "@{}".format(self.username)

forms.py

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm
from django import forms
class UserCreateform(UserCreationForm):

    address = forms.CharField(max_length=150, required=True)
    phone_number = forms.IntegerField(required=True)

    class Meta(UserCreationForm.Meta):

        model = get_user_model()
        fields = ('username','email','password1','password2')


        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            self.fields['username'].label = 'Display Name'

views.py

from django.shortcuts import render
from django.urls import reverse_lazy
from django.views.generic import CreateView
from . import forms
# Create your views here.

class SignUp(CreateView):
    form_class = forms.UserCreateform
    success_url = reverse_lazy('login')
    template_name = 'account/signup.html'

如果字段不是 Model 的字段,则将字段添加到 ModelForm 并不会保存它们。所以当然,addressphone_number 不会保存,您的 User 模型没有这些字段。

您需要 Model 才能保存这些字段。如here所述,您有两个选择:

  • 创建一个 Profile 模型来保存所有额外字段
  • 创建自定义 User 模型,继承 AbstractUserAbstractBaseUser

我的建议:两者都做。将您的额外字段保存在 Profile 模型中。 子类 AbstractUser,因此您可以选择向 User 模型添加有用的方法和属性(现在,只是 __str__())。

为什么不只是子类化?因为随着您的应用程序的增长,您会想要向用户的个人资料中添加更多内容。也许您想创建不同类型的配置文件,例如私人资料和专业资料。 User 本身应该是紧凑的,只管理身份验证和权限。

注意:您当前的User模型错误。您 不能 子类 auth.User 而是 auth.AbstractUser.