python - 如何仅使用表单创建自定义用户?
问题描述
我是 Django 的初学者,正在使用 2.2 版。我创建了一个用户表单来为站点中的用户签名,但它无法将其他字段信息添加到数据库中
我尝试在字段列表中添加其他字段添加添加字段但没有任何效果`
表格.py
from django import forms
from django.contrib.auth import (
authenticate,
get_user_model
)
User = get_user_model()
class UserRegisterForm(forms.ModelForm):
username = forms.CharField(label='PUsername')
email = forms.EmailField(label='Email address')
email2 = forms.EmailField(label='Confirm Email')
password = forms.CharField(widget=forms.PasswordInput,label='Password')
password2 = forms.CharField(widget=forms.PasswordInput,label='ConfirmPassword')
age = forms.CharField(label='your age')
info = forms.CharField(label='info about you')
class Meta:
model = User
fields = [
'username',
'email',
'email2',
'password',
'password2',
'age'
'info'
]
def clean(self, *args, **kwargs):
username = self.cleaned_data.get('email')
email = self.cleaned_data.get('email')
email2 = self.cleaned_data.get('email2')
password = self.cleaned_data.get('password')
password2 = self.cleaned_data.get('password2')
if email != email2:
raise forms.ValidationError("Emails must match")
email_qs = User.objects.filter(email=email)
if password != password2:
raise forms.ValidationError("Passwords must match")
email_qs = User.objects.filter(email=email)
if email_qs.exists():
raise forms.ValidationError(
"This email has already been registered")
username_ex = User.objects.filter(username=username)
if username_ex.exists():
raise forms.ValidationError("This username is taken")
return super(UserRegisterForm, self).clean(*args, **kwargs)
视图.py
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate,get_user_model,login,logout
from .forms import CreateUserForms
import random
import string
def register_view(request):
if request.method=='POST':
frm=CreateUserForm(request.POST)
if frm.is_valid():
username, email, password = frm.cleaned_data['username'], frm.cleaned_data['email'], frm.cleaned_data['password1']
new_user = User.objects.create_user(username, email, password)
new_user.is_active = True # if you want to set active
new_user.save()
else:
frm=CreateUserForm()
return render(request,'registration/signup.html',{'form':frm})
def logout_view(request):
logout(request)
return redirect('/')
预期结果是工作形式,但实际结果只是保存用户名、密码和电子邮件
解决方案
你的问题的标题是
如何仅使用表单创建自定义用户?
答案是:这是不可能的。无论你想保存到数据库中,你必须有一个相应的模型。表单仅确定客户提交哪些数据以及如何处理这些数据。
因此,如果您想为您的用户保存列age
,info
则必须在数据库中创建一个Model
相应的表和列来保存这些值。
现在,默认的 DjangoUser
模型只接受username
,email
和password
(加上一些布尔值,如,is_staff
等...)。如果你想保存额外的信息,你有几个选项在官方文档中有很好的描述,要么扩展默认模型,要么替换它。is_superuser
is_active
User
开始一个新的 Django 项目时的建议是至少总是用你自己的User
模型替换(见这个)。如果您只有一种类型的用户,请在您的自定义模型上添加age
和info
字段。User
但是,如果您有可能拥有不同类型的用户,age
并且info
将来可能不相关,请User
使用配置文件扩展您的自定义模型。
推荐阅读
- python-3.x - 训练多个 Keras NN 模型时出现分段错误(核心转储)
- react-native - Json 数据在 ios 中有一段时间在反应本机中损坏
- cassandra-3.0 - cassandra中多个表的物化视图
- angular - Angular2网站在错误后显示奇怪的行为
- tensorflow - Tensorflow 中返回的名称不正确导致调用 get_tensor_by_name 时出现“不存在的张量”错误
- docker - 如何在 kubernetes 上为谷歌云作曲家 apt-get 安装包
- node.js - 'firebase serve' 不显示某些错误
- javascript - 需要帮助自动重组 facebook 消息 HTML?
- angular - 如何通过 .subscribe() 从响应中设置外部变量的值
- python - 将具有日期时间索引的行插入数据框