上下文处理器和手动呈现

时间:2016-07-13 22:12:13

标签: python django django-templates

在我的Django应用程序中,我需要通过Ajax调用刷新页面的一部分。关联视图返回一个JsonResponse对象,其中上下文中的一个键是重新呈现的HTML。

这样的事情:

def myview(request):
    ...
    tmpl8 = template.loader.get_template('page-table.html')
    new_body = tmpl8.render({ 'rows': MyModel.custom_query() })
    context = { 'new_body': new_body,
                'other_info': other_information_for_javascript }
    return JsonResponse(request, context)

现在,我也有了添加通用信息的上下文处理器。渲染page-table.html时需要执行其中一些操作。

不幸的是,上下文处理器不会被裸Template.render()调用。它们是在返回的JsonResponse对象上调用的,但到目前为止已经太晚了,因为我已经渲染了模板。

在Django 1.9中,您可以提供RequestContextTemplate.render并且事情进展顺利 - 除了控制台中出现的弃用警告。 Django 1.10坚持Template.render被赋予dict

所以,我能想出的最好的是:

from .context_processors import my_context_processor

def myview(request):
    ...
    tmpl8 = template.loader.get_template('page-table.html')

    render_context = { 'rows': MyModel.custom_query() }
    render_context.update(my_context_processor(request))
    new_body = tmpl8.render(render_context)

    context = { 'new_body': new_body,
                'other_info': other_information_for_javascript }
    return JsonResponse(request, context)

基本上明确地调用处理器。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

让我们看看render文档说的内容:

  

Template.render(context = None,request = None)
  呈现此模板   具有给定的背景。

     

如果提供上下文,则必须是dict。如果没有提供,   引擎将使用空上下文呈现模板。

     

如果提供了请求,则必须是HttpRequest。然后发动机   必须在模板中提供它以及CSRF令牌。   如何实现这一点取决于每个后端。

     

以下是搜索算法的示例。对于这个例子   TEMPLATES设置为:

第二个参数是请求!所以我们有

 new_body = tmpl8.render(render_context, request)

答案 1 :(得分:1)

尝试将request传递给render()方法:

new_body = tmpl8.render({ 'rows': MyModel.custom_query() }, request)