0

私は、inclusion_tags を使用して、サイト全体のさまざまな場所で繰り返されるページの一部を生成しています。

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() を完全に書き換えるのを避けるために、 ビューでtemplatetags を使用する方法に関するこの回答で推奨されているように、次のことを行いました

ビュー.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 %}、テンプレート タグを標準の方法で呼び出すと機能しますが、このややハックな方法で呼び出すと機能しません (同じコードを 2 回書くのを避けるため)。

(より単純なテンプレート タグの場合return render (request, template_name, context)、ビュー内から呼び出すとこれで問題なく動作します。)

では、ビュー内からテンプレート タグを呼び出して、すべてのミドルウェアを適切に呼び出すより良い方法はありますか? または、このハックを適切に機能させるために追加できるものはありますか?

4

2 に答える 2

1

問題の核心はわかりませんが、いつでも手動でトークンをプルできます(ミドルウェアはこの関数を呼び出します)。

from django.middleware.csrf import get_token

csrf = get_token(request)
于 2012-11-05T22:28:26.060 に答える
0

コンテキストを RequestContext にする必要があります。

context = RequestContext(request, {....})
于 2012-11-05T22:47:10.770 に答える