如何使登录表单在 Django 的整个站点上可用
Posted
技术标签:
【中文标题】如何使登录表单在 Django 的整个站点上可用【英文标题】:How to make the login form available on whole site on Django 【发布时间】:2012-03-12 04:45:10 【问题描述】:我正在使用 Django 注册来管理注册和登录/注销以及 Django 的身份验证系统。它工作正常,我有一个基本模板,我在其中放置了一个“登录”链接,该链接将用户带到另一个页面进行登录。我想用实际的登录表单(用户名/密码)替换此链接,以便表单直接出现在每个页面中。有什么建议吗?
【问题讨论】:
您应该注意,如果您的站点通过 HTTP 可见并且您的登录页面是 HTTPS(应该如此),那么由于 CSRF 检查,HTTP --> HTTPS POST 将失败。见code.djangoproject.com/ticket/13849 或groups.google.com/group/django-developers/browse_thread/thread/… 【参考方案1】:您可以使用inclusion template tag 构建一个如下所示的自定义标签:
% login_form %
您可能希望将此标记传递给request.get_absolute_uri
,以便它可以在登录视图的?next= request.get_absolute_uri
参数中使用它,以便用户可以在登录后重定向到当前页面。
这样,您可以将登录表单放在任何模板中的任何位置,而不会违反 DRY 原则。您甚至可以使用以下方式将其嵌入到您的基本模板中:
% if not user.is_authenticated %
% login_form %
% else %
# display welcome message. #
% endif %
【讨论】:
我几乎可以按照您描述的方式工作,但我不明白如何从标签视图中访问请求,有什么提示吗? 好的,从这里得到它access-request-in-django-custom-template-tags 但即使可以访问请求,我也不知道如何传递 request.get_absolute_uri。你能澄清一下吗? @Bastian:在您链接到的问题中关注accepted answer。只需使用takes_context
开关,访问请求,获取 URI(仍然全部在 Python 中)并将其放入新的上下文变量字典(您的模板标记函数的返回值)并从您的登录表单模板访问它。
我喜欢你的方法,很干净!【参考方案2】:
有几种不同的方法可以做到这一点:
-
修改基本模板并对表单进行硬编码(仅
字段 - 不要忘记 CSRF 令牌)。
使用上下文处理器使 Django 表单变量
可用于每个模板。
创建自定义模板标签以显示
表单并将其用于您的基本模板。
您可能希望将逻辑包装在模板中,如下所示:
% if user.is_authenticated %
<!-- maybe show a logout link -->
% else %
<!-- display your form using one of the methods above -->
% endif %
注意:如果您使用auth template context processor,用户变量将在您的所有模板上可用。
【讨论】:
【参考方案3】:我已将我的登录表单嵌入到基本模板中,并将request.user
传递给我的站点模板,以便仅在用户尚未登录时才显示登录表单。
所以在我看来,我包含'user': request.user
,我的模板看起来与此类似:
% if not user.is_authenticated %
<form><fieldset><!-- Your login form here --></fieldset></form>
% else %
<!-- If you want to display something else if the user is logged in, like -->
<p>Welcome, user !</p>
% endif %
【讨论】:
以上是关于如何使登录表单在 Django 的整个站点上可用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 djangocms 在每个页面中使用 django-userena 登录和注销表单?