Django 带有内置的用户身份验证系统。此配置执行最常见的项目需求,处理各种任务以及有效的密码和权限。

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

什么是用户对象?

用户对象是用户认证系统的主要组成部分。它们被表示为网站访问者,用于实现阻止访问、注册用户配置文件、将内容与创建者相关联等功能。但是“超级用户”“管理员”类用户对象提供了特殊属性。

用户对象由以下主要属性组成。

  • username
  • password
  • Email
  • first_name
  • last_name

Django 用户创建表单

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)  

现在我们将在Hello.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/ 发送请求时,我们得到如下形式。

输出:

1.png

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

UserCreationForm ()提供有限的字段。假设我们要发送验证邮件来验证用户;我们不能这样做,因为它没有电子邮件字段。

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

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

为此,我们要么修改 UserCreationForm,包括电子邮件字段和验证工具,要么从头开始创建新的用户注册表单。

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

现在,我们将创建*forms.py*文件,并在示例应用程序的forms.py 文件中创建新类CustomUserCreationForm

例子 -

python_projectMyfirstdjangoprojectHellosampleappforms.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、password1和password2。接下来,我们为每个字段定义单独的方法来清理数据。如果仔细观察,会发现密码 1 和密码 2 字段中都使用了小部件字段。小部件键参数允许更改字段的默认小部件。

  • 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)  

输出:

2.png

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

3.png

当您尝试使用相同的用户名创建用户时,它将显示一条消息 -具有该用户名的用户已存在。

4.png

我们还可以通过添加更多字段和功能来扩展此CustomeUserCreationForm,并且我们还可以使用form.ModelForm类。但在本教程中,我们使用了form.Form类。在接下来的教程中,我们将实现电子邮件验证属性,用户可以在其中接收邮件进行验证。要创建电子邮件验证工具,我们需要存储一些有关用户的附加数据,但在本教程中我们无法这样做。我们将完成即将推出的用户模型教程。

标签: django语言, django教程, django技术, django学习, django学习教程, django下载, django开发, django入门教程, django进阶教程, django高级教程, django面试题, django笔试题, django编程思想