向UserRegisterPerform Django添加额外字段(';城市';)

向UserRegisterPerform Django添加额外字段(';城市';),django,django-models,django-forms,django-views,django-users,Django,Django Models,Django Forms,Django Views,Django Users,当新用户注册时,我要存储: fields=[“用户名”、“电子邮件”、“密码1”、“密码2”、“城市”] 因此,我通过在表单中添加“city”扩展了UserRegisterForm 它在模板中呈现良好,并保存除“城市”之外的所有内容。当通过管理员页面检查时,新用户配置文件中甚至没有“城市”列,因此看起来好像没有创建一个 我发现很少有类似的帖子,并且一直在关注Doc,但这没有帮助 我已经尝试了很多不同的方法,但我想我会发布两种最明智的方法 例1 -*forms.py* ... 来自django导

当新用户注册时,我要存储:

fields=[“用户名”、“电子邮件”、“密码1”、“密码2”、“城市”]

因此,我通过在表单中添加“city”扩展了UserRegisterForm

它在模板中呈现良好,并保存除“城市”之外的所有内容。当通过管理员页面检查时,新用户配置文件中甚至没有“城市”列,因此看起来好像没有创建一个

我发现很少有类似的帖子,并且一直在关注Doc,但这没有帮助

我已经尝试了很多不同的方法,但我想我会发布两种最明智的方法

例1


-*forms.py*
...
来自django导入表单
从django.contrib.auth.models导入用户
从django.contrib.auth.forms导入UserCreationForm
类UserRegisterPerform(UserCreationForm):
email=forms.EmailField()
city=forms.CharField(必需=True)
类元:
模型=用户
字段=['username'、'email'、'password1'、'password2'、'city']
def save(self,commit=True):
user=super(UserRegisterForm,self).save(commit=False)
user.city=self.cleaned_数据['city']
如果提交:
user.save()
返回用户
-*views.py*
...
从django.contrib.auth.forms导入UserCreationFormfrom
from.forms导入UserRegisterForm
def寄存器(请求):
如果request.method==“POST”:
form=UserRegisterForm(request.POST)
如果form.is_有效():
form.save()
打印('有效')
username=form.cleaned\u data.get('username'))
消息。成功(请求,
“{}您的帐户已创建!您现在可以登录了。格式(用户名))
返回重定向(“/login/”)
其他:
form=UserRegisterForm()
上下文={
“形式”:形式,
}
返回呈现(请求'users/register.html',上下文)
@需要登录
def配置文件(请求):
返回呈现(请求“users/profile.html”)
-*模板*
...
{%csrf_令牌%}
{{form | crispy}}
注册
在示例2中,Iam使用新模型创建新类“ProfileForm”,将其作为单独的表单,并将其包含在views.py中的一个带有UserRegisterPerform的函数中

例2


-*models.py*
...
类配置文件(models.Model):
city=models.CharField(最大长度=25,空白=False)
定义(自我):
回归自我城市
-*forms.py*
...
类UserRegisterPerform(UserCreationForm):
email=forms.EmailField()
city=forms.CharField(必需=True)
类元:
模型=用户
字段=['username'、'email'、'password1'、'password2'、'city']
类ProfileForm(forms.ModelForm):
类元:
模型=外形
字段=['city']
def save(self,commit=True):
user=super(UserRegisterForm,self).save(commit=False)
user.city=self.cleaned_数据['city']
如果提交:
user.save()
返回用户
-*views.py*
...
从django.contrib.auth.forms导入UserCreationFormfrom
从.forms导入UserRegisterPerform,ProfileForm
def寄存器(请求):
如果request.method==“POST”:
form=UserRegisterForm(request.POST)
form2=ProfileForm(request.POST)
如果form.is\u valid()和form2.is\u valid():
form.save()
表格2.save()
打印('有效')
username=form.cleaned\u data.get('username'))
消息。成功(请求,
“{}您的帐户已创建!您现在可以登录了。格式(用户名))
返回重定向(“/login/”)
其他:
form=UserRegisterForm()
form2=ProfileForm()
上下文={
“形式”:形式,
“form2”:form2
}
返回呈现(请求'users/register.html',上下文)
-*模板*
...
{%csrf_令牌%}
{{form | crispy}}
{{form2}}
注册

您的
配置文件
模型应与
用户
模型具有如下关系:

    Class Profile (models.Model):
        user = models.OneToOneField (User,on_delete=models.CASCADE)  
        city = models.CharField (max_length=25,blank=False)
您不需要定义ProfileForm。您可以像这样为用户创建配置文件对象

    form = UserRegisterForm (request.POST)
    if form.is_valid ():
         city = form.cleaned_data ['city']
         user = form.save ()
         Profile.objects.create (user=user,city=city)
         return redirect ('some_view)
要向用户模型中添加字段,必须定义