Django All-Auth - 在帐户创建时验证链接对象?

时间:2016-03-14 01:49:39

标签: python django django-allauth

好吧,那么,使用Django和All-Auth处理注册(没有社交注册),我想要做的是当我拿一个用户的名字时,我想将它与第二个表的行进行比较。 / p>

简而言之,user充当(真实世界)玩家的标识符,玩家可以拥有多个character,我想检查以确保{{1}没有使用与用户名匹配的名称,并且两者都注册用户并为他们创建匹配其用户名的字符,如果可以的话。

要明确:

如果用户尝试注册的名称的字符不存在,请让用户注册并创建该字符。

如果存在具有用户试图注册的名称的字符,则返回“已取名”的错误。

这不仅仅是用户配置文件的一对一扩展,因为每个用户可能有许多字符 - 而不仅仅是一个。不需要额外的表单字段,因为必须已将必要的数据作为用户名的一部分输入。

我似乎不理解验证,因为它在all-auth中以一种可以实现这一点的方式发生,并且我已经阅读了源代码块和readthedocs页面。

我很乐意扩展或回答有关此事的问题。 (我相信我的服务器上的python版本是2.x。)

我认为奖金的额外问题已经回答:

我还想保留一些角色名称,无论出于什么原因作为受保护的角色,这样人们就无法注册帐户来匹配(并且基本上在目标社区中冒充功人)。以何种方式我可以指示名称不能使用,因为它是受保护的名称并提供有关注册的额外数据?

1 个答案:

答案 0 :(得分:2)

我没有做过你想做的事情,所以我不能给你确切的代码,但我相信解决方案是你定义自己的DefaultAccountAdapter,并尝试覆盖new_usersave_user方法。

要编写自己的适配器,需要设置以下设置

ACCOUNT_ADAPTER = 'path.to.adapters.YourAccountAdapter'

然后定义

from allauth.account.adapter import DefaultAccountAdapter

class YourAccountAdapter(DefaultAccountAdapter):

    def clean_username(self, username, shallow=False):
        # -----------------------
        # do our validation first
        # -----------------------

        # character exists with username?
        if (YourModel.objects.filter(loginname__iexact=str(username))):

            # let's poke this a bit
            char = YourModel.objects.get(loginname__iexact=str(username))

            # is it a protected character name?
            if char.protected:
                raise ValidationError("Name belongs to protected character, please contact site admin to claim")
            else:
                raise ValidationError("Character with name exists, cannot use as a login name")

        # -----------------------------------------
        # if that went okay, call and return parent
        # -----------------------------------------
        return super(YourAccountAdapter, self).clean_username(username, shallow)

请参阅http://django-allauth.readthedocs.org/en/latest/advanced.html

另一种选择(或者其他一些操作)是使用您自己的注册表单,您可以在接受表单之前预先验证用户名字段。为此,您需要在设置中添加以下内容

ACCOUNT_FORMS = { 'signup': 'path.to.forms.AllauthSignupForm'}

然后使用

from allauth.account.forms import SignupForm
from django.core.validators import ValidationError

class AllauthSignupForm(SignupForm):

    def clean_username(self):
        # check for duplicates here and then
        if duplicate:
             raise ValidationError("Username is not allowed")

    return org