使用 Django 打造自定义用户注册流程

2023-06-17 08:56:59

在 Django 中,通常的用户注册流程是通过使用 Django 的内置UserCreationForm 表单来实现的。然而,这种方式有时不能够满足我们的需求。

在这篇文章中,我们将探讨如何使用 Django 构建一个自定义的用户注册流程。我们将使用一个名为CustomUserCreationForm 的自定义表单,并且使用之前自定义过的CustomUser 模型来代替 Django 内置的用户模型。

Step 1 – 自定义用户模型

from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=20)
    address = models.CharField(max_length=255)
    is_verified = models.BooleanField(default=False)

上面的代码中我们扩展了 Django 自带的用户模型,增加了phone_numberaddressis_verified 字段。

Step 2 – 自定义用户注册表单

from django import forms
from .models import CustomUser

class CustomUserCreationForm(forms.ModelForm):
    password1 = forms.CharField(
        label="Password",
        strip=False,
        widget=forms.PasswordInput(attrs={'autocomplete': 'new-password'}),
        help_text="Your password must contain at least 8 characters.",
    )
    password2 = forms.CharField(
        label="Password confirmation",
        widget=forms.PasswordInput(attrs={'autocomplete': 'new-password'}),
        help_text="Enter the same password as before, for verification.",
        strip=False,
    )

    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'phone_number', 'address', 'password1', 'password2', 'is_verified')

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords do not match.")
        return password2

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

如上所述,我们定义了一个名为CustomUserCreationForm 的自定义用户表单,并扩展了 Django 默认的UserCreationForm 表单。在这个表单中,我们对密码进行了验证,并且增加了新字段phone_numberaddress

Step 3 – 修改注册视图

from django.urls import reverse_lazy
from django.views import generic
from .forms import CustomUserCreationForm

class SignUpView(generic.CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'registration/signup.html'

最后一步是将我们的自定义表单集成到视图中。我们定义了一个名为SignUpView 的类视图,并且指定了使用我们自定义的CustomUserCreationForm 表单。在这里我们使用了继承自generic.CreateView 的类视图,以便利用 Django 自带的视图功能。

在 Django 中,我们使用reverse_lazy() 函数来获取登录成功后的跳转地址,并且指定使用我们自定义的registration/signup.html 模板。

总结

在本文中,我们使用 Django 打造了一个自定义用户注册流程。我们扩展了 Django 的默认用户模型,并且定义了CustomUserCreationForm 表单,最后将其集成到视图中。

  • 作者:
  • 原文链接:
    更新时间:2023-06-17 08:56:59