我正在使用inclusion_tags生成部分页面,这些页面在我网站的许多不同位置重复。从视图调用模板标签 - CSRF不滚动填充
templatetags/tags.py
@register.inclusion_tag('chunk_template.html')
def output_chunk(object, edit):
... # Lots of set up work here that I don't want to duplicate in the view
return { ... }
在AJAX页面上的形式提交的,我需要刷新()由output_chunk输出非常相同的HTML。为了避免完全在视图中改写output_chunk(),I did the following as recommended in this answer about how to use templatetags in views:
views.py
def chunk(request, ...):
context = Context({..., 'request': request })
template_string = """
{% load output_chunk from tags %}
{% output_chunk ... %}
"""
t = Template(template_string)
return HttpResponse(t.render(context))
这是所有工作正常,但chunk_template.html调用{% csrf %}
,当我打电话的模板标签标准的其中工程方式,但不是当我用这种有点冒险的方式调用时(避免两次写同样的代码)。
(对于比较简单的模板标签,这当我打电话return render (request, template_name, context)
从视图中正常工作。)
那么,有没有更好的方法来调用从视图中的模板标签让调用适当的所有中间件?还是有什么我可以添加到这个黑客使其正常工作?
啊,有用的捷径。但我想我找出了问题所在 - 我需要调用使上下文成为RequestContext('RequestContext(request,{...})')来调用中间件。我仍然想知道是否没有更好的方法来从视图中调用模板标签,尽管......这一切似乎都很难。 – TAH
那么模板标签具有{%csrf_token%}的上下文 - 如果您呈现一个字符串,它没有这样的上下文。 –
是的,但我现在看到,如果我将上下文指定为RequestContext而不是常规的Context,那么如果我在同一个字符串上调用'HttpResponse(t.render(context))',那么它现在就拥有了上下文。 – TAH