📜  Python|扩展和自定义 django-allauth

📅  最后修改于: 2022-05-13 01:55:14.389000             🧑  作者: Mango

Python|扩展和自定义 django-allauth

先决条件:Django-allauth 设置和配置

让我们处理自定义 django-allauth 注册表单,干预注册流程以添加自定义流程和验证。

扩展注册表单或在 django-allauth 中添加自定义字段:

关于 allauth 的最常见查询之一是向注册表单添加其他字段或自定义字段。您可以从 allauth.account.forms 扩展 SignupForm 类。您需要做的就是创建一个自定义类,将 SignupForm 传递给自定义类并定义自定义字段并保存它。返回用户对象至关重要,因为它将被传递给其他模块进行验证。您还需要在 settings.py 中包含一个变量。

让我们使用示例forms.py 来看看这一点。

Python3
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


Python3
ACCOUNT_FORMS = {
'signup': 'YourProject.forms.CustomSignupForm',
}


Python3
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


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


在上面的代码片段中,CustomSignupForm 继承了 SignupForm 类的所有特性并添加了必要的特性。在这里,名为 first_name 和 last_name 的自定义字段是使用同一类中的注册模块创建和保存的。

上面代码的 settings.py 中的 ACCOUNT_FORMS 是

Python3

ACCOUNT_FORMS = {
'signup': 'YourProject.forms.CustomSignupForm',
}

创建的任何其他自定义表单都可以在 ACCOUNT_FORMS 中扩展。该列表在文档中进行了说明。
同样, LoginForm UserForm AddEmailForm等也可以扩展。但是,请记住,当您扩展这些表单并将它们链接到 settings.py 时。不要忘记将原始表单(例如SignupForm )作为参数传递给您的类,有时您可能必须处理自定义验证并返回用户或其他值。请参考源代码以遵循正确的流程。用户干预和自定义验证:

让我们讨论添加自定义验证和干预用户注册流程。 DefaultAccountAdapter非常有用,确实可以用来解决用户在使用djangoallauth时可能遇到的大多数自定义问题。

示例 #1:电子邮件的受限列表

在找到存储和获取受限列表的方法后,您可以使用适配器并在受限电子邮件尝试注册时在注册表单中引发验证错误。扩展DefaultAccountAdapter并覆盖clean_email方法。在您的项目目录中创建一个 adapter.py 并扩展默认的适配器类。

Python3

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:为用户名添加最大长度

由于 allauth 库中不存在 ACCOUNT_USERNAME_MAX_LENGTH,因此使用DefaultAccountAdaptercan来实现此功能并不费力。扩展DefaultAccountAdapter类并覆盖clean_username方法。在我们的自定义验证之后,您还需要再次引用clean_username以完成其他内置验证。

上一段中的最后一句话是使用DefaultAccountAdapter的关键。您永远不要忘记引用模块的原始模块名称来完成其他验证。

Python3

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_usernameclean_password (可自定义限制常用密码)等模块可以有自定义流程和流程,无需重写。
如果在正确的情况下使用DefaultAccountAdapter来干预 allauth 的默认过程,它可能是一个有效的工具。 allauth 带有各种各样的内置设置,它们就在这里。

您还可以从下面参考资料中的链接下载整个源代码。
参考:
django-allauth 文档
示例 1 上的堆栈溢出线程