在base.html中包含Django登录表单

时间:2013-02-26 10:08:40

标签: django authentication django-forms

我是Django的新手,我想将我的登录表单包含在基础HTML中。

我有以下内容:

“注册/ login.html的”

{% if form.has_errors %}
    <p>Your username and password didn't match.
        Please try again.</p>
{% endif %}
<form method="post" action=".">
    {% csrf_token %}
    <p><label>Username:</label>
        {{ form.username }}</p>
    <p><label>Password:</label>
        {{ form.password }}</p>
    <input type="submit" value="login" />
    <input type="hidden" name="next" value="/" />
</form>

urls.py

url(r'^login/$', 'django.contrib.auth.views.login'),

我在base.html中包含了以下内容:

{% include "registration/login.html" %}

它呈现除用户名和密码的文本框之外的所有内容。我想我错过了什么。

2 个答案:

答案 0 :(得分:7)

好吧,问题,我想,你是在期待“神奇”。

Django的观点是模板非常愚蠢。它们只有可用的变量,它们以两种方式之一传递:

  1. 通过context_processor(参见Aidan的回答)
  2. 在调用render(或render_to_response)
  3. 时传入

    当您访问/login时表单呈现的原因,但在其他情况下,是因为Django视图您正在使用django.contrib.auth.views.login,将Django AuthenticationForm传递给您的模板。

    在此处查看来源: https://github.com/django/django/blob/master/django/contrib/auth/views.py

    没有其他视图“神奇地”获取该变量集。

    所以你必须要么:

    1. 在整个应用中的每个视图中自行设置
    2. 使用上下文处理器。
    3. 这是一个简单的context_processors.py,它使用Django的东西(基于Aidan的):

      def include_login_form(request):
          from django.contrib.auth.forms import AuthenticationForm
          form = AuthenticationForm()
          return {'login_form': form}
      

      然后,就像Aidan指出的那样:

      TEMPLATE_CONTEXT_PROCESSORS = (
          #....
          'yourapp.context_processors.include_login_form'
      )
      

      现在,问题在于,当您只包含模板时,登录表单位于名为“login_form”的变量中,但是当django的内置视图使用您的模板时,它位于名为“form”的变量中。 / p>

      所以这是一个没有良好“干净”解决方案的折磨,尽管我确信可以解决这个问题。

      也许检查在context_processor中传入的上下文,如果已经存在一个名为“form”的变量,看看它是否是AuthenticationForm的一个实例,如果是,请改为使用它。

答案 1 :(得分:1)

我听起来形式实际上并未传递给模板。如果您希望每个页面都包含登录表单,那么您可能希望添加context processor

创建一个context_processors.py文件,例如 -

def include_login_form(request):
    form = YourLoginForm()
    return {'login_form': form}

然后将新的上下文处理器添加到TEMPLATE_CONTEXT_PROCESSORS设置 -

TEMPLATE_CONTEXT_PROCESSORS = (
    #....
    'yourapp.context_proecssors.include_login_form',
)

这意味着您的所有模板都可以使用上下文变量login_form