首页 > 解决方案 > 如何仅使用表单创建自定义用户?

问题描述

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

预期结果是工作形式,但实际结果只是保存用户名、密码和电子邮件

标签: pythondjangopython-3.xdjango-formsdjango-views

解决方案


你的问题的标题是

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

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

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

现在,默认的 DjangoUser模型只接受username,emailpassword(加上一些布尔值,如,is_staff等...)。如果你想保存额外的信息,你有几个选项在官方文档中有很好的描述,要么扩展默认模型,要么替换它。is_superuseris_activeUser

开始一个新的 Django 项目时的建议是至少总是用你自己的User模型替换(见这个)。如果您只有一种类型的用户,请在您的自定义模型上添加ageinfo字段。User但是,如果您有可能拥有不同类型的用户,age并且info将来可能不相关,请User使用配置文件扩展您的自定义模型。


推荐阅读