在 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_number
,address
和is_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_number
和address
。
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
表单,最后将其集成到视图中。