我想在网页的任何地方放置一个登录表单,所以我添加了context_processor
并将其包含在base.html文件中。现在的问题是我看不到表格。
这是我的context_processors.py:
def global_login_form(request):
if request.method == 'POST':
formLogin = LoginForm(data=request.POST)
if formLogin.is_valid():
from django.contrib.auth import login
login(request, formLogin.get_user())
...
else:
formLogin = LoginForm()
return {'formLogin': formLogin}
这是我在base.html中尝试调用表单的不同html:
<form action="/myapp/login/" method="post">
{% csrf_token %}
{{global_login_form}}
</form>
<form action="/myapp/login/" method="post">
{% csrf_token %}
{{global_login_form.as_p}}
</form>
<form action="/myapp/login/" method="post">
{% csrf_token %}
{{request.formLogin}}
</form>
第一次加载页面时,
context_process
返回{'formLogin': formLogin}
(因为formLogin
是LoginForm()
),但是在检查html时看不到表单。它不存在...但是我可以看到csrf_token
,所以我认为我没有正确调用上下文。只是这种情况(可能是顺序不正确),这是settings.py:
TEMPLATE_CONTEXT_PROCESSORS = (
"myapp.context_processors.global_login_form",
"django.core.context_processors.request",
"django.contrib.auth.context_processors.auth",
)
有任何想法吗?
最佳答案
我认为OP错误地认为模板上下文变量将与上下文处理器的函数名称匹配。
OP的上下文处理器global_login_form()
将formLogin
注入模板上下文。因此,在模板中,表单应被引用为{{ formLogin.as_p }}
。