如何在Django上的整个站点上提供登录表单

时间:2012-02-21 20:48:21

标签: django login

我正在使用Django注册来管理注册和登录/注销以及Django的auth系统。它工作正常,我有一个基本模板,我在其中放置了一个“登录”链接,将用户带到另一个页面进行登录。我想用实际的登录表单(用户名/密码)替换此链接,以便表单直接显示在每个页面中。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

您可以使用inclusion template tag构建如下所示的自定义标记:

{% login_form %}

您可能希望将此标记传递给request.get_absolute_uri,以便它可以在?next={{ request.get_absolute_uri }}参数中将其用于登录视图,以便用户在登录后可以重定向到当前页面。 p>

这样,您可以将登录表单放在任何模板中,而不违反DRY原则。您甚至可以使用以下内容将其嵌入基本模板中:

{% if not user.is_authenticated %}
  {% login_form %}
{% else %}
  {# display welcome message. #}
{% endif %}

答案 1 :(得分:2)

您可以采用以下几种方式:

  1. 修改基本模板并对表单进行硬编码(只有少数几个 字段 - 不要忘记CSRF令牌)。
  2. 使用上下文处理器创建Django表单变量 适用于每个模板。
  3. 创建要显示的自定义模板标记 表单并在基本模板上使用它。
  4. 您可能希望将逻辑包装在模板中,如下所示:

    {% if user.is_authenticated %}
       <!-- maybe show a logout link -->
    {% else %}
       <!-- display your form using one of the methods above -->
    {% endif %}
    

    注意:如果您使用的是auth template context processor,则所有模板上都会显示用户变量。

答案 2 :(得分:1)

我已将我的登录表单嵌入到基本模板中,并将request.user传递给我的网站模板,以便仅在用户尚未登录时才显示登录表单。

所以在我看来,dict包括'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 %}