在我的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中,您可以提供RequestContext
到Template.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)
基本上明确地调用处理器。
我错过了什么?
答案 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)