Python 扩展和定制 django-allauth
让我们来处理定制django-allauth注册表单的问题,介入注册流程,添加自定义流程和验证。
在django-allauth中扩展注册表或添加自定义字段:。
关于allauth最常见的疑问之一是关于在注册表单中添加额外的字段或自定义字段。你可以从allauth.account.forms扩展SignupForm类。你只需要创建一个自定义类,将SignupForm传给自定义类,定义自定义字段并保存。返回用户对象是非常重要的,因为它将被传递给其他模块进行验证。你还需要在settings.py中包含一个变量。
让我们用一个例子来看看 forms.py .
from allauth.account.forms import SignupForm
from django import forms
class CustomSignupForm(SignupForm):
first_name = forms.CharField(max_length=30, label='First Name')
last_name = forms.CharField(max_length=30, label='Last Name')
def save(self, request):
user = super(CustomSignupForm, self).save(request)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.save()
return user
在上面的片段中,CustomSignupForm被扩展为一个类,它继承了SignupForm类的所有功能并增加了必要的功能。在这里,通过名字first_name和last_name的自定义字段被创建,并使用同一类中的签名模块保存。
上述代码的settings.py中的ACCOUNT_FORMS是
ACCOUNT_FORMS = {
'signup': 'YourProject.forms.CustomSignupForm',
}
任何其他创建的自定义表格都可以在ACCOUNT_FORMS中扩展。该列表在文档中进行了说明。
同样地,LoginForm UserForm AddEmailForm和其他表格也可以被扩展。然而,请记住,当你扩展这些表单并在settings.py中链接它们时。不要忘记将原始表单(例如SignupForm )作为参数传递给你的类,有时你可能需要处理自定义验证并返回用户或其他一些值。请参考源代码以遵循正确的流程。
用户干预和自定义验证:。
我们来讨论一下添加自定义验证和干预用户注册流程的问题。DefaultAccountAdapter非常有用,确实可以用来解决用户在使用django–allauth时可能遇到的大部分定制问题。
例子#1:限制性的电子邮件列表。
在找到存储和获取受限名单的方法后,你可以使用适配器,并在受限邮件试图注册时在注册表中引发验证错误。扩展一个DefaultAccountAdapter并重写clean_email方法。在你的项目目录下创建一个适配器.py,并扩展默认的适配器类。
from allauth.account.adapter import DefaultAccountAdapter
from django.forms import ValidationError
class RestrictEmailAdapter(DefaultAccountAdapter):
def clean_email(self, email):
RestrictedList = ['Your restricted list goes here.']
if email in RestrictedList
raise ValidationError('You are restricted from registering.\
Please contact admin.')
return email
最后,将settings.py中的账户适配器指向你的扩展类。
ACCOUNT_ADAPTER='YourProject.adapter.RestrictEmailAdapter'
例子2:为用户名添加最大长度。
由于ACCOUNT_USERNAME_MAX_LENGTH在allauth库中并不存在,DefaultAccountAdapter可以用来实现这个功能,而不需要太多痛苦。扩展DefaultAccountAdapterclass并重写clean_username方法。在我们的自定义验证之后,你还需要再次引用clean_username来完成其他内置的验证。
上段的最后一句话是使用DefaultAccountAdapter的关键。你千万不要忘记引用模块的原始名称来完成其他验证。
from allauth.account.adapter import DefaultAccountAdapter
from django.forms import ValidationError
class UsernameMaxAdapter(DefaultAccountAdapter):
def clean_username(self, username):
if len(username) > 'Your Max Size':
raise ValidationError('Please enter a username value\
less than the current one')
# For other default validations.
return DefaultAccountAdapter.clean_username(self, username)
最后,在你的settings.py中指向这个子类
ACCOUNT_ADAPTER = 'YourProject.adapter.UsernameMaxAdapter'
你可以参考源代码中的adapters.py文件,扩展其他模块,增加一个过程或改变它们的流程。像populate_username, clean_password这样的模块(可以自定义限制常用的密码)可以有自定义的过程和流程,而不用重写它们。
DefaultAccountAdapter可以是一个强大的工具,如果在正确的情况下使用,可以干预allauth的默认过程。