Calling a templatetag from a view — CSRF not gtting populated

筅森魡賤 提交于 2019-12-13 21:54:49

问题


I am using inclusion_tags to generate portions of my pages that repeat in many different places across my site.

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 { ... }

Upon AJAX submit of a form on the page, I need to refresh the very same HTML outputted by output_chunk(). To avoid completely rewriting output_chunk() in a view, 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))

This is all working fine, except chunk_template.html calls {% csrf %}, which works when I call the template tag the standard way, but not when I call in this somewhat hacky way (to avoid writing the same code twice).

(For simpler template tags, this works fine when I call return render (request, template_name, context) from within the view.)

So, is there a better way to call the template tag from within the view to get all the middleware invoked properly? Or is there something I can add to this hack to make it work properly?


回答1:


I don't understand the core of the problem, but you can always manually pull the token (the middleware calls this function).

from django.middleware.csrf import get_token

csrf = get_token(request)



回答2:


Need to make the context a RequestContext.

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


来源:https://stackoverflow.com/questions/13241278/calling-a-templatetag-from-a-view-csrf-not-gtting-populated

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!