2016-12-07 20 views
1

Шаблоны Django позволяют включать другие шаблоны для составления вашей страницы. Это особенно полезно, если вы хотите отобразить всю страницу, но можете захотеть повторно загрузить ее часть с помощью AJAX и не хотите перемещать всю визуализацию в javascript (или, что еще хуже: дублировать его в javascript).Как использовать csrf_token в шаблоне django, включенном с ограниченным контекстом

В том числе шаблона может выглядеть следующим образом:

{% include "template.html" %} 

Однако, если этот шаблон может быть использован различными видами, вполне вероятно, что ваш контекст не только надстройка контекста для этого шаблона. Поэтому Django позволяет указать контекст для шаблона.

Поскольку я хочу избежать случайного введения различного поведения, когда шаблон визуализируется путем включения в другой шаблон, и когда шаблон отображается в качестве основного шаблона для представления, мне также имеет смысл использовать опцию only чтобы избежать доступа к контексту родительского шаблона.

Так мой включают выглядит следующим образом:

{% include "sub_template.html" foo=sub_context.foo bar=sub_context.bar only %} 

Однако, добавив, что only вызывает проблему: {% csrf_token %} больше не работает в этом шаблоне, потому что я думаю, некоторые из скрытых магии, что делает Django был исключен.

Ошибка, которая регистрирует Джанго является

UserWarning: А {% csrf_token%} использовали в качестве матрицы, но контекст не предусматривает значение. Обычно это вызвано не использованием RequestContext.

Родительский шаблон является визуализации с RequestContext, а когда шаблон суб визуализируется в качестве основного шаблона, и не включается, не возникает ошибка.

Наиболее очевидным решением этой проблемы является не использование опции only для include, что кажется стыдом. Есть ли лучший способ решить эту проблему?

ответ

1

У меня была такая же проблема, и согласен с тем, что использование не только не является идеальным решением.

Оказывается, {{}} csrf_token прекрасно работает в родительском шаблоне, таким образом Вы можете использовать это, чтобы отправить голую csrf_token через к прилагаемому шаблону:

{% включают «sub_template.html» Foo = sub_context. foo csrf_token = csrf_token only%}

Затем тег {% csrf_token%} отлично работает на другой стороне и использует это значение для вывода полного скрытого элемента ввода. И вы все еще получаете преимущества использования только в include.

Мой ответ был найден экспериментирования с ответами на этот вопрос: Django's {{ csrf_token }} is outputting the token value only, without the hidden input markup