Django Шаблон наследования: сколько уровней и какую страницу визуализировать

Я хотел бы получить несколько советов по построению уровней шаблонов Django.

Читая документы, я не понимаю, как создать шаблон иерархической структуры с более чем 2 уровнями.

Например, я хотел бы создать 3 уровня наследования:

base.html
    └── base_level2.html
            ├── level2_level3_1.html
            └── level2_level3_2.html

Это мой код:

base.html

First level
{% block level2 %}{% endblock %}

base_level2.html

{% extends "base.html" %}
{% block level2 %}
    Second level
    {% block level3_1 %}{% endblock %}
    {% block level3_2 %}{% endblock %}
{% endblock %}

level2_level3_1.html

{% extends "base_level2.html" %}
{% block level3_1 %}
    Third level, part 1
{% endblock %}

level2_level3_2.html

{% extends "base_level2.html" %}
{% block level3_2 %}
    Third level, part 2
{% endblock %}

views.py:

def myView(request):
    return render_to_response('level2_level3_1.html', {}, context_instance=RequestContext(request))

Таким образом, я вижу следующее в моем браузере:

First level
Second level
Third level, part 1

И это логично для меня, потому что я звонюrender_to response только на level2_level3_1.html.

Конечно, если позвонить level2_level3_2.html, я получу сообщениеThird level, part 2 но не тот.Third level, part1

Как это решить? Это хороший подход? Я'Я структурировал таким образом, потому что мои настоящие шаблоны очень большие, много строк кода, поэтому я хотел бы сохранитькакой-то порядок. Любой совет будет оценен.

 EsseTi03 июн. 2013 г., 17:50
какие'проблема? ты хочешь иметьThird level, part 1 а такжеThird level, part 2, почему можетВы положили обе части на одной странице? они принадлежат двум разным блокам.
 caneta03 июн. 2013 г., 21:55
Как я уже сказал выше "я"Я структурировал вещи таким образом, потому что мои настоящие шаблоны очень большие ... », Это минимальный пример, но мои level2_level3_1.html и level2_level3_2.html на самом деле очень длинные, и я неЯ не хочу объединять их в один огромный файл.

Ответы на вопрос(2)

трудно сказать, если этоХорошая или плохая идея, или нет, не зная специфики ваших шаблонов, но моя немедленная реакция заключается в том, что вы 'Пытаемся перестроить ваши шаблоны. Я думаю, что большинство людей будут убеждать вас отказаться от более чем трехуровневой системы, потому что это затрудняет внесение небольших изменений в веб-сайт и усложняет отслеживание того, где что находится. из дзен питона:

Квартира лучше, чем вложенная

Рекомендация для 3-уровневой системы вДва совка Джанго выглядит так:

Каждое приложение имеетbase_.html шаблон. Базовые шаблоны уровня приложения имеют общего родителя base.html.Шаблоны в приложениях имеют общую родительскую базу_Шаблон .html.Любой шаблон на том же уровне, что и base.html, наследует base.html.

и для вашей схемы именования это может выглядеть так:

  | Templates/
  |--base.html
  |--someothertemplate.html # extends base.html
  |--level2/
  |----base_level2.html     # extends base.html
  |----level2_1.html        # extends base_level2.html
  |----level2_2.html        # extends base_level3.html

РЕДАКТИРОВАТЬ: и тамНет реальной причины для этого:

    Second level
   {% block level3_1 %}{% endblock %}
   {% block level3_2 %}{% endblock %}

где каждый блок относится к содержанию одного шаблона. Вы можете упростить это до одного блока, как

{% block level3 %}{% endblock level3%}

а затем в каждом из шаблонов уровня 3 соответственно переименуйте блоки

 caneta04 июн. 2013 г., 14:44
Это не "Двухуровневые", Но как разбить ................ уровень3. Да, эти уровни отображаются на той же странице, как показано в примере. Да, я хотел бы расколоть свою страницу, чтобыпроще управлять. Мой шаблон длиной в тысячи строк, потому что он очень большой и сложный, а не потому, что я не использую средства Django, теги шаблонов и так далее ...
 skzryzg04 июн. 2013 г., 09:56
Можете ли вы объяснить, что вы подразумеваете под "Двухуровневые"? Эти уровни отображаются на одной странице? и ты'просто пытаюсь расколоть свою страницу, чтобылегче управлять? Если ваш шаблон длиной в тысячи строк, вы 'вероятно, что-то делаю не так. Вы должны писать код, который генерирует HTML для вас.
 caneta03 июн. 2013 г., 22:00
Итак, нет способа разделить level3, даже если он длиной в тысячи строк?

не самый лучший способ сделать это, но вы могли бы использоватьinclude https://docs.djangoproject.com/en/dev/ref/templates/builtins/#include

что-то вроде этого для меняbase_level2.html

{% extends "base.html" %}
{% block level2 %}
Second level
{% include "level2_level3_1.html" %}   
{% include "level2_level3_2.html" %} 
{% endblock %}

Я не проверял это, поэтому не уверен, что это работает.

и кстати:

Тег включения следует рассматривать как реализацию «визуализировать этот подшаблон и включить HTML »не какразобрать этот подшаблон и включить его содержимое, как если бы оно было частью родительского », Это означает, что между включенными шаблонами нет общего состояния - каждое включение является полностью независимым процессом рендеринга.

 EsseTi04 июн. 2013 г., 14:44
но он должен делать то, что вам нужно, вы даже можете передавать параметры.
 caneta04 июн. 2013 г., 14:41
Да, это'за то, что я не сделалт использовал тег включения.
 caneta04 июн. 2013 г., 14:45
Хорошо, я попробую, спасибо!

Ваш ответ на вопрос