我是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" %}
它呈现除用户名和密码的文本框之外的所有内容。我想我错过了什么。
答案 0 :(得分:7)
好吧,问题,我想,你是在期待“神奇”。
Django的观点是模板非常愚蠢。它们只有可用的变量,它们以两种方式之一传递:
当您访问/login
时表单呈现的原因,但在其他情况下,是因为Django视图您正在使用django.contrib.auth.views.login
,将Django AuthenticationForm传递给您的模板。
在此处查看来源: https://github.com/django/django/blob/master/django/contrib/auth/views.py
没有其他视图“神奇地”获取该变量集。
所以你必须要么:
这是一个简单的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
。