2012-11-05 15 views
0

我正在使用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)从视图中正常工作。)

那么,有没有更好的方法来调用从视图中的模板标签让调用适当的所有中间件?还是有什么我可以添加到这个黑客使其正常工作?

回答

0

需要使上下文成为RequestContext。

context = RequestContext(request, {....}) 
1

我不明白问题的核心,但你总是可以手动拉取令牌(中间件调用这个函数)。

from django.middleware.csrf import get_token 

csrf = get_token(request) 
+0

啊,有用的捷径。但我想我找出了问题所在 - 我需要调用使上下文成为RequestContext('RequestContext(request,{...})')来调用中间件。我仍然想知道是否没有更好的方法来从视图中调用模板标签,尽管......这一切似乎都很难。 – TAH

+0

那么模板标签具有{%csrf_token%}的上下文 - 如果您呈现一个字符串,它没有这样的上下文。 –

+0

是的,但我现在看到,如果我将上下文指定为RequestContext而不是常规的Context,那么如果我在同一个字符串上调用'HttpResponse(t.render(context))',那么它现在就拥有了上下文。 – TAH