Django - 使用 context_processor

标签 django forms login django-views django-templates

我想在网页的任何地方都放一个登录表单,所以我添加了一个 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()注入(inject) formLogin到模板上下文。因此,在模板中,应将表单引用为,例如 {{ formLogin.as_p }} .

关于Django - 使用 context_processor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6491046/

相关文章:

asp.net - 发布asp.net网站以在本地IIS服务器上进行测试

django - 如何在 Django ORM 中的 From 子句中编写子查询

Python 框架 : Website/CMS vs application?

python - 提交表单,并在python中使用mechanise获取结果

java - jquery是否可以同时提交表单并发送ajax请求

jquery - 如何从特定表单中删除字段

python - Django 1.8 PUT和DELETE方法简单实现

python - Django - syncdb 不创建表

login - 由于登录 3 次失败而禁用帐户

login - 具有安全和数据库用户的Symfony 4登录表单