我正在尝试通过用户的电子邮件而不是用户名对用户进行身份验证。
我正在使用django-userena
并通过使用它的文档等。我设置了几乎所有需要的东西。类似的东西:USERENA_WITHOUT_USERNAMES = True
在它的设置等。
但是注册后,我遇到了一系列问题。比如尝试在 url 中传递我的用户名以进行身份验证、注册完成问题等。
我更改了一些需要用户名作为参数的视图函数,但是这种方法既没有解决我的问题,也不是正确(也许是安全)的方法。
例如,通过路由到这个 URL http://127.0.0.1:8000/accounts/signup/complete/
(之后$ ./manage.py check_permissions
)我得到这个错误:
global name 'username' is not defined
/userena/views.py in directto_user_template
user = get_object_or_404(User, username_iexact=username)
有什么我想念的吗?
更新: 这是我得到的输出:
渲染时捕获 NoReverseMatch:使用参数 '('xyz@xyz.com', '70b60d1d97015e03ba8d57f31e4c7ff14d6ab753')' 和关键字参数 '{}' 的“userena_activate”反向。
很明显,userena 尝试将电子邮件作为带有 URL 的用户名:
userena/templates/userena/emails/activation_email_message.txt,第 8 行错误
1 {% load i18n %}{% autoescape off %}
2 {% if not without_usernames %}{% blocktrans with user.username as username %}Dear {{ username }},{% endblocktrans %}
3 {% endif %}
4 {% blocktrans with site.name as site %}Thank you for signing up at {{ site }}.{% endblocktrans %}
5
6 {% trans "To activate your account you should click on the link below:" %}
7
8 {{ protocol }}://{{ site.domain }}{% url userena_activate user.username activation_key %}
9
10 {% trans "Thanks for using our site!" %}
11
12 {% trans "Sincerely" %},
13 {{ site.name }}
14 {% endautoescape %}
更新2:
好的。通过阅读SignupFormOnlyEmail
类形式的源代码,它说自动生成一个随机用户名。
class SignupFormOnlyEmail(SignupForm):
"""
Form for creating a new user account but not needing a username.
This form is an adaptation of :class:`SignupForm`. It's used when
``USERENA_WITHOUT_USERNAME`` setting is set to ``True``. And thus the user
is not asked to supply an username, but one is generated for them. The user
can than keep sign in by using their email.
"""
def __init__(self, *args, **kwargs):
super(SignupFormOnlyEmail, self).__init__(*args, **kwargs)
del self.fields['username']
def save(self):
""" Generate a random username before falling back to parent signup form """
while True:
username = sha_constructor(str(random.random())).hexdigest()[:5]
try:
User.objects.get(username__iexact=username)
except User.DoesNotExist: break
self.cleaned_data['username'] = username
return super(SignupFormOnlyEmail, self).save()
更新 :
我终于解决了这个问题。我也在使用django-email-as-username
旁边django-userena
。这是我的问题的原因。显然,他们有一些冲突。小心