Django注册、Django.contrib.auth登录和用户“is active”标志

4
我正在使用django 1.1。文档http://docs.djangoproject.com/en/1.1/topics/auth/#topics-auth中关于is_active标志的说明如下:
这不控制用户是否可以登录。身份验证路径中没有任何内容检查is_active标志,因此,如果您想根据is_active为False拒绝登录,则需要在自己的登录视图中检查它。但是,使用像has_perm()这样的方法进行权限检查会检查此标志,并且始终对非活动用户返回False。
我正在使用django-registration(最新版本0.8 alpha),并使用所有默认后端。 django-registration的整个前提都基于is_active标志。即仅在用户激活后才设置。但是,当用户登录时,我可以看到它正在使用django.contrib.auth.views.login。我可以从auth_urls.py中的代码中看到这一点。
当用户注册但尚未激活时,我希望显示一条消息,内容大致为“您尚未激活您的帐户”。

目前默认行为是表单的错误消息会显示“用户名和密码不匹配”

我还在我的视图中使用登录装饰器

@login_required

我的问题是:

编辑: 感谢James和Henry。我觉得我并没有很好地描述我的问题。我重新做了一遍。

  1. Django文档说,在登录用户时,is_active不用作决定因素。但很明显这不是事实。你可以自己试试。我无法找出代码中发生这种情况的位置。有人知道吗?据我所见,它既没有在django-registration中发生,也没有在django.contrib.auth中发生。
  2. 为了显示上面描述的错误消息,我应该如何做才能达到最佳效果?请记住,我正在使用django-registration,因此已经完成了很多工作。如果可能的话,我不想修改或重写所有内容。如果可能的话,我正在寻找一个......“优雅”的解决方案。

提前感谢

关于问题1,

2个回答

5
感谢所有思考这个问题的人。最终我注意到默认模板中有一些我之前没有注意到的HTML代码。
{% if form.errors %}
<div class="error">
<p>Your username and password didn't match. Please try again.</p>
</div>
{% endif %}

看到这个之后感觉有点傻。我从另一个项目中复制了代码,只是假设错误是动态生成的而不是硬编码的。

然后我开始进行调查。

forms.errors 

and found

forms.non_field_errors

当我尝试着如何样式化输出时(因为默认情况下愚蠢的东西会将其输出在html ul标签内),我发现了这个链接:

Django output form errors as table rows in {{ form.as_table }}

感谢 chands(因为他的问题使答案变得明显)

有一个评论。至少对于1.1版本,文档真是糟糕透了。 为什么官方 Django 文档没有更明确地说明这一点,超出了我的理解。看起来像是人们想要做的基本事情。


0

我认为问题出在django-registration上。

请参考https://bitbucket.org/ubernostrum/django-registration/src/tip/docs/quickstart.rst第132行的信息。

它说不允许非活跃用户登录。

更新

您可以编写自己的后端或使用简单的后端,并在您的个人资料模型中添加一个名为activated的新属性。这需要相当多的工作。

至于它在哪里,我假设它在django.contrib.auth.views.login中。我没有花太多时间去查看它,但我认为你可以很容易地复制它并创建自己的版本。(如果确实是问题的话)

然后,您需要在auth_urls.py文件中替换它以用于登录URL。

编辑

我刚刚去了1.2文档检查差异。

http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.models.User.is_active 你会发现它说表单确实测试了它。所以要么它一直这样做,但没有描述清楚,要么你已经升级到1.2并且忘记/不知道了。


@James_Khoury 谢谢 James,我花了更多时间研究代码后,我确定这必须在django.contrib.auth中检查(而不是在django-registration中)。你知道在哪里吗?你指向我的代码行只是描述我已经观察到的内容。此外,有什么想法可以实现专门的错误消息吗?谢谢。 - w--
@w-- 对不起。我更新了我的答案。 - James Khoury
@w-- 刚在文档中找到了一条有用的信息,应该会有所帮助。 - James Khoury
@James_Khoury 谢谢。显然我正在运行1.1.1...也许在那个补丁中他们改变了这个?无论如何,我仍然不知道在代码中它是如何被检查的,但是我找到了如何获得正确的错误消息。谢谢。 - w--
@w-- https://code.djangoproject.com/browser/django/tags/releases/1.1.1/django/contrib/auth/forms.py 第82行。这是用于登录用户的表单。在此处,它会检查用户是否处于活动状态。如果需要,我可以快速提供一份说明,告诉您如何覆盖此功能。 - James Khoury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接