Django UserCreationForm创建新用户

Django UserCreationForm创建新用户

Django带有一个内置的用户认证系统。此配置执行项目所需的大部分常见要求,处理各种任务,以及有效的密码和权限。

我们可以通过导入用户认证模块来创建用户登录。本文将讨论 UserCreationForm ,用于创建新用户。它是一个内置模块,继承自 ModelForm 类。在学习Django UserCreationForm之前,让我们简要介绍一下 用户。

用户对象是什么

用户对象是用户认证系统的主要组成部分。它们代表网站访问者,并用于启用防止访问、注册用户配置文件、将内容与创建者相关联等功能。但是 ‘superuser’‘admin’ 类用户对象提供了特殊属性。

用户对象包括以下主要属性。

  • 用户名
  • 密码
  • 电子邮件

实现Django UserCreationForm

Django UserCreationForm用于创建可以使用我们Web应用的新用户。它有三个字段: 用户名、密码1密码2 (用于确认密码)。

要使用UserCreationForm,我们需要从 django.contrib.auth.forms 导入它。

from django.contrib.auth.forms import UserCreationForm

在这里,我们将创建处理请求的视图。

view.py 文件

from django.shortcuts import render
from django.contrib.auth.forms import UserCreationForm
# Create your views here.

def register(request):
    if request.POST == 'POST':
        form = UserCreationForm()
        if form.is_valid():
            form.save()
    messages.success(request, 'Account created successfully')

    else:
        form = UserCreationForm()
    context = {
        'form':form
    }
    return render(request, 'register.html', context)

现在我们将在 Helllo.url.py 中创建路径来处理请求。

from django.urls import path
from django.contrib import admin
from sampleapp.views import register


urlpatterns = [
   path('admin/', admin.site.urls),
    path('register', register, name = 'register')
]

template/base.html

<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">

    <title>Register Page</title>
  </head>
  <body>
  {% block content %}

    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>


    {% endblock content %}
  </body>
</html>

接下来,我们将通过在模板文件夹中扩展 base.html 文件来创建 register.html 文件。

template/register.html

{% extends 'base.html' %}

{% block content %}

<div class = "login">

    {% if messages %}
        <ul> 
            {% for message in messages %}
                <li>{{ message }}</li>
                {% endfor %}
        </ul> 
    {% endif %}

    <h1>Register Here - JavaTpoint Blog</h1>

         <form method="post" >
             {% csrf_token %}
             <table>
                {{ form.as_table }}
                 <tr>
                    <td></td>
                    <td><input type="submit" name="submit" value="Register" /></td>
                </tr>
             </table>
         </form>
     </div>

{% endblock content %}

当我们使用http://127.0.0.1:8000/register/发送请求时,我们得到以下表单。

输出:

Django UserCreationForm创建新用户

当我们点击注册按钮时,将生成POST请求并创建新用户。新创建的 用户 使用 UserCreationForm()is_superuseris_staff 设置为False,但 is_active 设置为True。

UserCreationForm() 提供了有限的字段。假设我们想要发送验证邮件以验证用户,我们无法做到这一点,因为它没有 电子邮件 字段。

正确的用户注册表单应采取以下步骤。

  • 用户填写详细信息并点击提交按钮。
  • 网站向提交的邮件发送验证链接。
  • 用户在他们输入的邮件中收到验证链接。

要做到这一点,要么修改UserCreationForm,包括电子邮件字段和验证功能,要么从头开始创建一个新的用户注册表单。

我们将创建新的用户注册表单,因为它将完全控制表单。

现在,我们将创建 forms.py 文件并在sampleapp的 forms.py 文件中创建新的类 CustomUserCreationForm

示例 –

\python_project\Myfirstdjangoproject\Hello\sampleapp\forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django.core.exceptions import ValidationError
from django.forms.fields import EmailField
from django.forms.forms import Form

class CustomUserCreationForm(UserCreationForm):
    username = forms.CharField(label='username', min_length=5, max_length=150)
    email = forms.EmailField(label='email')
    password1 = forms.CharField(label='password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput)

    def username_clean(self):
        username = self.cleaned_data['username'].lower()
        new = User.objects.filter(username = username)
        if new.count():
            raise ValidationError("User Already Exist")
        return username

    def email_clean(self):
        email = self.cleaned_data['email'].lower()
        new = User.objects.filter(email=email)
        if new.count():
            raise ValidationError(" Email Already Exist")
        return email

    def clean_password2(self):
        password1 = self.cleaned_data['password1']
        password2 = self.cleaned_data['password2']

        if password1 and password2 and password1 != password2:
            raise ValidationError("Password don't match")
        return password2

    def save(self, commit = True):
        user = User.objects.create_user(
            self.cleaned_data['username'],
            self.cleaned_data['email'],
            self.cleaned_data['password1']
        )
        return user

在上面的代码中,我们在 CustomUserCreationForm 中定义了四个字段:用户名(username)、电子邮件(email)、密码1(password1)和密码2(password2)。

接下来,我们为每个字段定义了一个独立的方法来清理数据。如果您仔细观察,widget字段在password1和password2字段中都被使用。widget关键参数允许更改字段的默认小部件。

  • username_clean() 方法将防止输入重复的用户名。
  • email_clean() 方法将防止输入重复的电子邮件。
  • clean_password2() 方法将检查密码是否匹配。

然后, save() 方法将保存数据。

现在,我们在 views.py 文件中更新 register() 视图。

from django.contrib.auth import forms
from django.shortcuts import redirect, render
from django.contrib import messages
from django.contrib.auth.forms import UserCreationForm
from .forms import CustomUserCreationForm
# Create your views here.

def register(request):
    if request.POST == 'POST':
        form = CustomUserCreationForm()
        if form.is_valid():
            form.save()
    else:
        form = CustomUserCreationForm()
    context = {
        'form':form
    }
    return render(request, 'register.html', context)

输出:

Django UserCreationForm创建新用户

在这里,我们输入用户详细信息以创建新用户,并且我们会得到以下输出。

Django UserCreationForm创建新用户

当您尝试使用相同的用户名创建用户时,将显示以下信息 –

用户名已存在。
Django UserCreationForm创建新用户

我们还可以通过添加更多字段和功能来扩展 CustomeUserCreationForm 类,也可以使用 form.ModelForm 类。但在本教程中,我们使用了 form.Form 类。在即将发布的教程中,我们将实现电子邮件验证属性,用户将收到验证邮件。为了创建电子邮件验证功能,我们需要存储一些与用户相关的额外数据,但在本教程中我们不具备这样的方式。我们将在即将发布的 用户模型 教程中实现这一功能。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程