如何仅使用表单创建自定义用户?

时间:2019-05-01 12:18:52

标签: python django python-3.x django-forms django-views

我是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('/')

预期结果为工作表,但实际结果仅保存用户名,密码和电子邮件

2 个答案:

答案 0 :(得分:0)

阅读有关python super的文档。您使用错误的方式。最后在clean方法中调用super意味着它在修改super之前会执行modelform clean方法和代码。

答案 1 :(得分:0)

您的问题的标题是

  

如何仅使用表单创建自定义用户?

答案是:这是不可能的。无论您想保存到数据库中什么,都必须具有相应的模型。表单仅确定客户端提交哪些数据以及如何处理这些数据。

因此,如果要为用户保存列ageinfo,则必须在数据库中创建一个Model以及相应的表和列以保存这些值

现在,默认的Django User模型仅采用usernameemailpassword(加上一些布尔值,例如is_staffis_superuseris_active等)。如果您想保存其他信息,可以通过扩展默认的User模型或替换模型来选择official docs中描述的一些选项。

开始新的Django项目时,建议始终至少使用您自己的User模型替代(请参见this)。如果只有一种类型的用户,请在自定义age模型上添加infoUser字段。但是,如果将来您可能拥有不同类型的用户,而ageinfo可能不再适用,请使用配置文件扩展自定义User模型。