django-registration, django.contrib.auth login and user "is active" flag



我正在使用 django 1.1。

http://docs.djangoproject.com/en/1.1/topics/auth/#topics-auth在is_active旗上写着

这无法控制是否 用户可以登录。什么都没有 身份验证路径检查 is_active标志,所以如果你想 拒绝基于is_active的登录 是假的,由你来检查 在您自己的登录视图中。然而 使用方法进行权限检查 像 has_perm() 确实检查此标志 并且将始终返回 False 非活动用户。

我正在使用 django 注册(最新的 0.8 alpha)并使用所有默认后端。django注册的整个前提是基于is_active标志。即它仅在用户激活后设置。但是,我可以看到当用户登录时,它使用的是django.contrib.auth.views.login。我可以从auth_urls.py的代码中看到这一点。

当用户注册但尚未激活时,我希望显示一条消息,内容类似于"您尚未激活您的帐户"

目前的默认行为是表单的错误消息,指出"用户名和密码不匹配"

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

@login_required

我的问题是:

编辑:谢谢詹姆斯和亨利。我不认为我非常擅长描述我的问题。我已经重做了这个。

  1. Django 文档说,is_active 在登录用户时不用作决定因素。这显然不是事实。自己试试吧。我无法弄清楚这在代码中发生在哪里。有人知道吗?据我所知,它不会发生在 django-registration 中,也不会发生在 django.contrib.auth 中。
  2. 为了显示我上面描述的错误消息,我最好的方法是什么?请记住,我正在使用 django 注册,所以很多管道已经完成。我宁愿不修改它或重写所有内容。如果可能的话,我正在寻找一个...."优雅"的解决方案。

提前致谢

关于Q1,

感谢所有思考这个问题的人。最后,我注意到默认模板中的一些html代码是我以前没有注意到的。

{% if form.errors %}
<div class="error">
<p>Your username and password didn't match. Please try again.</p>
</div>
{% endif %}

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

于是我开始调查

forms.errors 

并发现

forms.non_field_errors

并试图弄清楚如何设置输出样式(因为默认情况下,愚蠢的东西在 HTML ul 标签中输出它)发现:

Django 将表单错误输出为 {{ form.as_table }} 中的表行

谢谢手(因为答案从他的问题中变得很明显)

一条评论。关于此的文档(至少对于 1.1)很糟糕。为什么这在官方 django 文档中没有更明确,这超出了我的范围。似乎是一件非常基本的事情。

我认为问题出在 django 注册中。

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

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

更新

您可以编写自己的后端或使用简单的后端,并在配置文件模型上添加一个名为 activated 的新属性。这将是相当多的工作量。

至于它在哪里,我认为它在django.contrib.auth.views.login.没有花太多时间浏览它,我认为您可以相当轻松地复制它并制作自己的。(如果确实是问题所在)

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

编辑

我刚刚去文档 1.2 检查差异

http://docs.djangoproject.com/en/1.2/topics/auth/#django.contrib.auth.models.User.is_active你会看到它说表单确实测试了它。因此,要么它总是如此,但它没有正确解码,要么您已经更新到 1.2 并且忘记/不知道。

最新更新