我想在网页的任何地方放置一个登录表单,所以我添加了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}(因为formLoginLoginForm()),但是在检查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 }}

10-07 18:02