Django - 在所有模板文件中为 ajax 请求设置值

Django - Set value for ajax request in all template files

我有一个网站使用 ajax 内容加载来加载页面内容。对于所有页面,我检查是否为 ajax 的请求:

if request.is_ajax():
    return render(request, 'home.html', {'posts': posts,
                                        'base_theme': 'ajax_base.html',
                                        })
else:
    return render(request, 'home.html', {'posts': posts,
                                        'base_theme': 'base.html'
                                        })

我必须在所有操作中设置 base_theme,我必须在模板中再次设置:

{% extends base_theme %}

我如何在自动检查请求并为其设置值的地方设置请求的全局值。像这样:

if request.is_ajax():
    TEMPLATE_BASE = 'ajax_base.html'
else:
    TEMPLATE_BASE = 'base.html'

然后我正常设置渲染参数:

return render(request, 'home.html', {'posts': posts})

home.html 文件中我想要这个:

{% extends TEMPLATE_BASE %}

我可以这样做吗? 地点和方式?

这听起来正是 context processor 适合做的事情。

使用以下两行函数创建 myapp/context_processors.py 文件:

def template_base(request):
    template = 'ajax_base.html' if request.is_ajax() else 'base.html'
    return {'TEMPLATE_BASE': template}

并将此 context processor 添加到 TEMPLATE_CONTEXT_PROCESSORS 设置:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "myapp.context_processors.template_base",
)

现在您可以在模板中编写 {% extends TEMPLATE_BASE %}