Django All-Auth - 在创建帐户时针对链接对象进行验证?
Django All-Auth - Validate against linked object on account creation?
好的,所以,使用 Django 和 All-Auth 处理注册(没有社会注册),我想做的是当我输入一个用户名时,我想将它与第二个进行比较 table的行。
长话短说,user
充当(现实世界)玩家的标识符,玩家可以有很多 character
,我想检查以确保 character
不采用与用户名匹配的名称,如果可以的话,注册用户并为他们创建与用户名匹配的角色。
要明确:
如果用户尝试注册的角色名称不存在,则让用户注册并创建该角色。
如果用户尝试注册的名称的字符确实存在,return 一个错误 "name already taken"。
这不能仅作为用户个人资料的一对一扩展,因为每个用户可能有很多字符 - 而不仅仅是一个。不需要额外的表单字段,因为必要的数据应该已经作为用户名的一部分输入。
我似乎不理解验证,因为它以一种使这成为可能的方式发生在 all-auth 中,我已经阅读了一大块源代码和 readthedocs 页面。
我很乐意扩展或回答有关此事的问题。 (我相信我的 python 版本在我的服务器上是 2.x。)
一个额外的问题,我认为 bonus 已经回答了:
我还想出于某种原因保留一些角色名称作为受保护的角色,这样人们就无法注册帐户来匹配(基本上是冒名顶替目标社区中的有功之人)。我可以用什么方式表明一个名称不能使用,因为它是一个受保护的名称,并提供额外的注册数据?
我没有做任何你想做的事情,所以我不能给你确切的代码,但我相信解决方案是让你定义你自己的 DefaultAccountAdapter,并尝试覆盖 new_user
或 save_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
好的,所以,使用 Django 和 All-Auth 处理注册(没有社会注册),我想做的是当我输入一个用户名时,我想将它与第二个进行比较 table的行。
长话短说,user
充当(现实世界)玩家的标识符,玩家可以有很多 character
,我想检查以确保 character
不采用与用户名匹配的名称,如果可以的话,注册用户并为他们创建与用户名匹配的角色。
要明确:
如果用户尝试注册的角色名称不存在,则让用户注册并创建该角色。
如果用户尝试注册的名称的字符确实存在,return 一个错误 "name already taken"。
这不能仅作为用户个人资料的一对一扩展,因为每个用户可能有很多字符 - 而不仅仅是一个。不需要额外的表单字段,因为必要的数据应该已经作为用户名的一部分输入。
我似乎不理解验证,因为它以一种使这成为可能的方式发生在 all-auth 中,我已经阅读了一大块源代码和 readthedocs 页面。
我很乐意扩展或回答有关此事的问题。 (我相信我的 python 版本在我的服务器上是 2.x。)
一个额外的问题,我认为 bonus 已经回答了:
我还想出于某种原因保留一些角色名称作为受保护的角色,这样人们就无法注册帐户来匹配(基本上是冒名顶替目标社区中的有功之人)。我可以用什么方式表明一个名称不能使用,因为它是一个受保护的名称,并提供额外的注册数据?
我没有做任何你想做的事情,所以我不能给你确切的代码,但我相信解决方案是让你定义你自己的 DefaultAccountAdapter,并尝试覆盖 new_user
或 save_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