我是Django的初学者,正在使用2.2版。我创建了一个用户表单来在站点中对用户进行签名,但无法将其他字段信息添加到数据库中
我尝试在字段列表中添加其他字段,添加添加字段,但无济于事。
forms.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)
views.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('/')
预期结果为工作表,但实际结果仅保存用户名,密码和电子邮件
答案 0 :(得分:0)
阅读有关python super的文档。您使用错误的方式。最后在clean方法中调用super意味着它在修改super之前会执行modelform clean方法和代码。
答案 1 :(得分:0)
您的问题的标题是
如何仅使用表单创建自定义用户?
答案是:这是不可能的。无论您想保存到数据库中什么,都必须具有相应的模型。表单仅确定客户端提交哪些数据以及如何处理这些数据。
因此,如果要为用户保存列age
和info
,则必须在数据库中创建一个Model
以及相应的表和列以保存这些值
现在,默认的Django User
模型仅采用username
,email
和password
(加上一些布尔值,例如is_staff
,is_superuser
, is_active
等)。如果您想保存其他信息,可以通过扩展默认的User
模型或替换模型来选择official docs中描述的一些选项。
开始新的Django项目时,建议始终至少使用您自己的User
模型替代(请参见this)。如果只有一种类型的用户,请在自定义age
模型上添加info
和User
字段。但是,如果将来您可能拥有不同类型的用户,而age
和info
可能不再适用,请使用配置文件扩展自定义User
模型。