如何使登录表单在 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 登录和注销表单?

Django 管理站点有子表单吗?

不刷新的Django表单类

如何使整个表单(输入和提交按钮)在焦点上更改边框颜色(引导程序 3)

Django实战-----用户登录与注册系统4(表单)

使用 Django 在一个页面上登录和注册表单