Django: указание базового шаблона по каталогу - PullRequest
12 голосов
/ 22 марта 2009

Я работаю на сайте Django, который имеет несколько разделов и подразделов. Мне бы хотелось иметь несколько глубин наследования шаблонов: базовый шаблон для всего сайта, один базовый шаблон для каждого раздела, который наследуется от корневого базового шаблона, и так далее. Вот упрощенная версия моей желаемой структуры каталогов:

base.html
section1/
  base.html
section2/
  base.html
section3/
  base.html

Я бы хотел, чтобы все файлы в section1/ содержали что-то вроде {% extends "base.html" %}, то есть они расширяли бы section1/base.html. section1/base.html будет содержать что-то вроде {% extends "../base.html" %}, что означает расширение базового файла корневого уровня. Тем не менее, я не смог найти ничего в документации, предполагающей, что это возможно, и я не мог заставить Джанго различать "../base.html" и "base.html". ({% extends "../base.html" %} выдает ошибку.) Я полагаю, что одним из обходных путей будет переименование всех базовых файлов base_SECTIONNAME.html и обновление всех файлов, которые унаследованы от них, но я обеспокоен тем, что это может стать трудным для обслуживания, поскольку мой сайт становится больше а разделы меняют имена и т. д. Я бы предпочел решение, которое использует естественную иерархию, указанную в каталогах и подкаталогах.

Есть идеи?

Ответы [ 3 ]

18 голосов
/ 22 марта 2009

Может быть, я что-то наблюдаю, но все, что вы хотите, может быть достигнуто с помощью системы шаблонов django. Все вызовы extends относятся к каталогам шаблонов.

  1. Чтобы все файлы base.html в подкаталогах расширяли base.html, вам просто нужно поместить {% extends "base.html" %} в файлы. section1 / base.html будет выглядеть следующим образом.

    {% extends "base.html" %}

    {# ... rest of your code ...#}

  2. Теперь, чтобы получить файлы из секции 1 для расширения section1 / base.html , вам просто нужно поставить {% extends "section1/base.html" %} в верхней части. То же самое для раздела 2, раздела 3 и т. Д.

Это так просто, но может быть не совсем очевидно в документации.

Надеюсь, я понял ваш вопрос.

5 голосов
/ 23 марта 2009

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

# It may be convenient to make this function live in or near your url conf.
def convert_url_path_to_folder_path(path):
    # fill in the magic here

def sub_folder_available(request):
    folder = convert_url_path_to_folder_path(request.path)
    return {'subsection': folder, 'local_base':folder+'/base.html'}

Тогда в вашем шаблоне просто позвоните

{% extends local_base %}

Вероятно, есть еще дюжина других способов сделать это, но главное - подумать о том, чтобы избежать жесткого кодирования имени папки в шаблоне. Это даст вам много пробега, тем более что вы можете просто перетащить шаблон между разделами, если они окажутся достаточно похожими. Вы можете добавить еще одну вставку:

def sub_folder_available(request):
    folder = convert_url_path_to_folder_path(request.path)
    # Check if local base exists:
    if os.access(folder+'/base.html',os.F_OK):
        base = folder+'/base.html'
    else:
        # revert to your global base
        base = 'base.html'
    return {'subsection': folder, 'base':base}

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

0 голосов
/ 17 марта 2016

Вы можете использовать эту библиотеку: https://github.com/vb64/django.templates.relative.path

Просто напишите в своих шаблонах следующее:

{% loadlative_path%} {% extends ".base.html"%}

это расширит шаблон "base.html", расположенный в той же папке, где находится ваш шаблон

{% load относительный_путь%} {% extends "... base.html"%}

расширить шаблон "base.html", расположенный на два уровня выше

То же самое работает с тегом include.

...