Сведения о вопросе

Solllo

17:05, 21st August, 2020

Теги

Django    

Django template inheritance и ajax?

Просмотров: 368   Ответов: 4

Я только-только начал поглядывать в сторону Python+Django, поэтому знаком с ними на уровне чтения документации.

Насколько я понимаю, в шаблонах Django {% extends base.html %} должен идти первой строчкой. Однако, хотелось бы иметь возможность не наследоваться от базового шаблона, если это ajax-запрос. Условие сюда, видимо, написать нельзя, поэтому на данный момент очевиден только такой вариант:

Во view проверяем, не ajax-ли запрос. Если ajax — рендерим, к примеру,view-ajax.html. Иначе — view.html в котором:

{% extends base.html %}<br/>
###<br/>
{% include view-ajax.html %}




Однако, этот вариант не выглядит привлекательным. Как, скажем:



{% notajaxextends base.html %}



Но для такого, казалось бы, очевидного поведения писать, как мне сейчас видится, не самый простой темплейт-тег — кажется сомнительным. Почти уверен что существуют решения. Да и кроме того, при extends мы переопределяем блоки базового шаблона. А так как переопределять становится нечего — что же тогда выводить? Передавать требуемый блок как параметр тега?



{% notajaxextends base.html content %}<br/>
###<br/>
{% block content %} ... {% endblock %}




Поможете начинающему джангисту разрешить эту нелепую дилему?



  Сведения об ответе

fo_I_K

07:08, 10th August, 2020

А чем вариант с инклудом плох-то? Используйте его.


  Сведения об ответе

appple

16:37, 22nd August, 2020

Можно в base.html проверять флаг, и если он установлен — скрывать всё что вне {% block content %}. Не очень красиво, но проще, чем тег.


  Сведения об ответе

prince

07:48, 1st August, 2020

Есть возможность рендерить определенный блок из шаблона. Возможно вам помогут эти ссылки:
http://djangosnippets.org/snippets/769/
http://djangosnippets.org/snippets/1014/


  Сведения об ответе

VCe znayu

04:56, 14th August, 2020

{% extends is_ajax|yesno:'ajax_base.html,base.html' %}
где is_ajax = True для ajax-запроса.
не знаю, с какой версии будет работать.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться