Django: указание базового шаблона по каталогу

Я работаю над сайтом 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" и ---- +: = 7 =: + ----. ("base.html" выдает ошибку.) Я полагаю, что одним из обходных путей будет переименование всех базовых файлов {% extends "../base.html" %} и обновите все файлы, которые унаследованы от них, но я обеспокоен тем, что это может стать трудным для обслуживания, поскольку мой сайт становится больше, а разделы меняют имена и т. д. Я бы предпочел решение это использует естественную иерархию, указанную в каталогах и подкаталогах.

Есть идеи?

12 голосов | спросил RexE 22 MarpmSun, 22 Mar 2009 20:59:50 +03002009-03-22T20:59:50+03:0008 2009, 20:59:50

3 ответа


0

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

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

    {% extends "base.html" %}

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

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

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

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

ответил Oliver Andrich 22 MarpmSun, 22 Mar 2009 21:07:15 +03002009-03-22T21:07:15+03:0009 2009, 21:07:15
0

Принятый ответ будет работать, но я рекомендую использовать имена переменных, чтобы отслеживать структуру разделов. Мои личные предпочтения будут контекстный процессор . Если, например, организация раздела вашего сайта прозрачно отражена в 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}

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

ответил David Berger 23 MaramMon, 23 Mar 2009 08:00:58 +03002009-03-23T08:00:58+03:0008 2009, 08:00:58
0

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

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

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

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

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

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

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

ответил vb64 17 MarpmThu, 17 Mar 2016 14:27:47 +03002016-03-17T14:27:47+03:0002 2016, 14:27:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132