2

我是 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>

网址.py

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

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

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

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

4

2 回答 2

9

好的,我认为问题在于您期待“魔术”。

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

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

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

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

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

所以你必须:

  1. 在整个应用程序的每个视图中自行设置
  2. 使用上下文处理器。

这是一个context_processors.py使用 Django 东西的简单方法(基于 Aidan 的):

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

然后,按照艾丹指出的那样做:

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

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

所以这是一个没有好的“干净”解决方案的考验,尽管我相信有人可以解决它。

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

于 2013-02-26T10:42:20.943 回答
2

我听起来好像表单实际上并没有传递给模板。如果您希望登录表单包含在每个页面上,那么您可能需要添加一个上下文处理器

创建一个 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您的所有模板都可以使用上下文变量。

于 2013-02-26T10:18:17.587 回答