Блог Django CMS - Замена шаблонов для разных случаев. Шаблоны django cms


Django CMS Тэги шаблонов - Cult of digits

24 September 2013 г. 10:05:17

3.1. Тэги шаблонов в CMS

Перед использованием любого тэга шаблонов описанных ниже необходимо загрузить их добавив в самый верх шаблона тэг:

{% load cms_tags %}

 

3.1.1. placeholder

Изменения в версии 2.1 Название плейсхолдера стало чувствительным к регистру.

Тэг placeholder определяет расположение плейсхолдера на странице. Все плейсхолдеры в шаблоне находятся автоматически и могут быть заполнены необходимыми плагинами когда страница находится в режиме редактирования с заданным шаблоном. Когда страница отображается, содержание плагинов появятся в том месте где был определен тэг  placeholder.

~cut~

Пример:

{% placeholder "content" %}

 

Если Вы хотите чтобы отображалось дополнительное содежание, в случае если плейсхолдер пустой, воспользуйтесь аргуметом  or и дополнительным закрывающим тэгом {% endplaceholder %}. Все что находится между {% placeholder "..." or %} и {% endplaceholder %} отображается в том случае если плейсхолдер не содержит ни одного плагина или плагины ничего не выводят.

Пример:

{% placeholder "content" or %}There is no content.{% endplaceholder %}

 

Если вы хотите добавить дополнительные переменные в контекст плейсхолдера, вы должны воспользоваться тэгом with  Django. Например, если вы хотите изменить размер изображения в вашем шаблоне при помощи переменных контекста width вы можете воспользоваться следующим кодом:

{% with 320 as width %}{% placeholder "content" %}{% endwith %}

 

Если Вы хотите чтобы плейсхолдер наследовал содержание плейсхолдеров с таким-же именем с родительских страниц, просто передайте соответствующий аргумент inherit:

{% placeholder "content" inherit %}

 

Это заставит пройти вверх по дереву страниц пока и отобразит первый найденный плейсхолдер с содержанием.

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

{% placeholder "content" inherit or %}Ложки нет.{% endplaceholder %}

 

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

3.1.2. show_placeholder

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

Аргументы:

Примеры:

{% show_placeholder "footer" "footer_container_page" %} 

{% show_placeholder "content" request.current_page.parent_id %} 

{% show_placeholder "teaser" request.current_page.get_root %}

 

3.1.3. page_lookup

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

Если вы знаете страницу на которую вы ссылаетесь, то лучшим выбором будет использование reverse_id (для уникального имени страницы используется строка) это вариант более предпочтительны чем использовать ID в вашем шаблоне. Например, вы можете использовать страницу помощи и хотите иметь ссылку которая отображается в разных частях страницы. Чтобы это сделать, в можете открыть страницу помощи в панели администора и ввести ID (например help) в секции ‘Advanced’. Затем вы можете использовать этот идентификатор в reverse_id для соответствующего тэгов шаблонов:

{% show_placeholder "right-column" "help" %} 

<a href="{% page_url "help" %}">Help page</a>

 

Если вы ссылаетесь на страницу относительно текущей страницы, Вам возможно понадобиться использовать числовой идентификатор или передавать страницу объектом. Например, если вы хотите, чтобы содержание родительской страницы отображалось на текущей страницы, Вы можете использовать::

{% show_placeholder "content" request.current_page.parent_id %}

 

Или, возможно у Вас на странице есть плейсхолдер teaser, и если редактор  не заполнит текущую страницу специфическим содержанием, то он унаследует содержание предка корневого уровня:

{% placeholder "teaser" or %}     {% show_placeholder "teaser" request.current_page.get_root %} {% endplaceholder %}

 

3.1.4. show_uncached_placeholder

Тэг такой-же как и show_placeholder, однако содержание плейсхолдера не будет кэшироваться.

Аргументы:

Пример:

{% show_uncached_placeholder "footer" "footer_container_page" %}

 

3.1.5. page_url

Отображает URL страницы в соответствии с текущим языком.

Аргументы:

 

Пример:

<a href="{% page_url "help" %}">Help page</a>

<a href="{% page_url request.current_page.parent %}">Parent page</a>

Если соответствующая страница не найдена и Debug = true, будет вызвано исключение. Таким образом если Debug = false, исколючение не возникнет. К тому же, если SEND_BROKEN_LINK_EMAILS = True и у вас указан какой-либо адрес в MANAGERS, на данный email будет выслан адрес, чтобы проинформировать о плохой ссылке.

3.1.6. page_attribute

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

Аргументы:

Возможные значения для attribute_name являются: "title", "menu_title", "page_title", "slug", "meta_description", "meta_keywords" (учитите что Вы так-же можете предоставлять пргументы без кавычек, но этот метод является устаревшим, потому что аргументы могут так-же быть переменными шаблона.

Пример:

{% page_attribute "page_title" %}

Если вы предоставляете аргумент page_lookup, Вы получите значение аргумента на основе странице найденной по этому аргументу.

Пример:

{% page_attribute "page_title" "my_page_reverse_id" %}{% page_attribute "page_title" request.current_page.parent_id %}{% page_attribute "slug" request.current_page.get_root %}

Новое в версии2.3.2: Этот тэг поддерживает as аргумент. С помощью его вы можете назначить результат тэга в новую переменную которую Вы можете использовать в любом месте шаблона.

Пример:

{% page_attribute "page_title" as title %}<title>{{ title }}</title>

Это даже может быть использовано в комбинации с аргументом page_lookup.

Пример:

{% page_attribute "page_title" "my_page_reverse_id" as title %}<a href="/mypage/">{{ title }}</a>

Новое в  2.4.

3.1.7. render_plugin

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

Аргументы:

plugin

Плагин должен быть экземпляром модели плагина.

Пример:

{% load cms_tags %}<div>{% for plugin in instance.child_plugins %}        <div>        <div>        {% render_plugin plugin %}        </div>{% endfor %}</div>

 

Обычно потомки плагинов могут быть доступны через атрибут плагина child_plugins. Атрибут плагина allow_children должен быть устновлен в True чтобы активировать.

3.2. Меню тэгов шаблонов

Чтобы использовать любой из тэгов шаблонов, Вы сначала должны загрузить из добавив в в начало шаблона:

{% load menu_tags %}

 

3.2.1. show_menu

Тэг show_menu отображает навигацию текущей страницы. Вы можете переопределить внешний вид и HTML если вы добавите шаблон cms/menu.html в ваш проект или отредактировать шаблон предоставленых в CMS.

 show_menu принимает следующие опциональные параметры: start_level, end_level,extra_inactive и extra_active.

Первые два параметра start_level (по умолчанию=0) и end_level (по умолчанию=100) определяют начиная с какого и до какого уровня будет отображаться навигация. Если домашняя страница является корневой, и Вы не хотите ее отображать вы можете выводить меню только после первого уровня.

Третий параметр extra_inactive (по умолчанию=0), определяет количество уровней навигации, не являющихся наследниками или потомками текущей страницы, которые будут отображены.

И, наконец, четвертый параметр extra_active (по умолчанию=100), определяет количетво уровней потомков текущей страницы, которые будут отображены.

3.2.1.1. Примеры show_menu 

Полное меню в виде вложенного списка:

<ul>    {% show_menu 0 100 100 100 %}</ul>

Навигация для текущего уровня в виде вложенного списка:

<ul>    {% show_menu 0 100 0 100 %}</ul>

Навигация с только одним дополнительным уровнем:

<ul>    {% show_menu 0 100 0 1 %}</ul>

Навигация первого уровня в виде вложенного списка:

<ul>    {% show_menu 1 %}</ul>

Навигация с использованием собственного шаблона:

{% show_menu 0 100 100 100 "myapp/menu.html" %}

3.2.2. show_menu_below_id

If you have set an id in the advanced settings of a page, you can display the submenu of this page with a template tag. For example, we have a page called meta that is not displayed in the navigation and that has the id “meta”:

<ul>    {% show_menu_below_id "meta" %}</ul> You can give it the same optional parameters as show_menu: <ul>    {% show_menu_below_id "meta" 0 100 100 100 "myapp/menu.html" %}</ul>

3.2.3. show_sub_menu

Отображает подменю текущей страницы в виде вложенного списка.

Первый аргумент,  levels (по умолчанию=100), определяет количества уровней в глубину которое будет отображено.

Второй аргумент, root_level (по умолчанию=None), определяет какой уровень, если есть, будет корневым, если root_level =  0  меню будет начинаться с этого уровня несмотря на уровень текущей страницы.

Третий аргумент  nephews (по умолчанию=100), определяет количество уровней  или элементов на том же уровне, будет отображено

Шаблон может быть найден в cms/sub_menu.html:

<ul>    {% show_sub_menu 1 %}</ul>

Корневой уровень 0:

<ul>    {% show_sub_menu 1 0 %}</ul>

Или используя собственный шаблон:

<ul>    {% show_sub_menu 1 "myapp/submenu.html" %}</ul>

3.2.4. show_breadcrumb

Отображает “хлебыные крошки” текущей страницы. Шаблон может быть найден в  cms/breadcrumb.html:

{% show_breadcrumb %}

Или используя собственный шаблон, который выводит только второй уровень или выше:

{% show_breadcrumb 2 "myapp/breadcrumb.html" %}

 

Обычно, в “хлебные крошки” выводятся только видимые страницы, чтобы включить все страницы воспользуйтесь:

{% show_breadcrumb 0 "cms/breadcrumb.html" 0 %}

 

Если текущий URL не управляется CMS или дополнительной навигацией, текущий узел меню не может быть определен. В этом случае Вам может понадобиться предоставить Ваши собственные “хлебные крошки” с помощью шаблона. В основном это надо для таких страниц как страница входа, выхода или сторонние приложения. Это может быть легко сделано при помощи переопределения вашего шаблона.

Например в вашем шаблоне base.html:

<ul> {% block breadcrumb %} {% show_breadcrumb %} {% endblock %} <ul>

 

И ваш шаблон приложения:

{% block breadcrumb %} <li><a href="/">home</a></li> <li>My current page</li> {% endblock %}

 

3.2.5. page_language_url

Возвращает url текушей страницы для другого языка:

{% page_language_url de %} {% page_language_url fr %} {% page_language_url en %}

 

Если текущий url не имеет страниц не связанных с cms и страницы управляются при помощи дополнения навигации и изменение языка основывается на изменении url, то Вам понадобиться установить функцию language_changer используя функцию set_language_changer в cms.utils.

Для получения большей информации смотрите раздел интренационализация.

3.2.6. language_chooser

Тэг language_chooser будет отображать выбор языка на текущей странице. Вы можете изменить шаблон в  menu/language_chooser.html или предоставит свой собственный шаблон, если необходимо.

Пример:

{% language_chooser %}

 

Или используя собственный шаблон:

{% language_chooser "myapp/language_chooser.html" %}

 

language_chooser испольщует три различных режима которые будут отображаться языки. Вы можете выбрать:

Режим может быть передан строкой в качестве последнего аргумента language_chooser tag.  В режме“raw”, язык будет отображаться так же как отображется полное имя  в настройках. В режиме “native” язык будет отображаться на родном языке (например немецкий будет отображаться как “Deutsch”, Японскйи как “日本語” и так далее). В режиме “current” языки будут переведены на тот язык, который установлен у пользователя в данный момент ( например, если сайт отображается на немецком, то японский язык будет отображаться как “Japanisch”). Режим “Short” отображает только код  языка (например “en”).

Если текущий url не 

Если текущий url не имеет страниц не связанных с cms и страницы управляются при помощи дополнения навигации и изменение языка основывается на изменении url, то Вам понадобиться установить функцию language_changer используя функцию set_language_changer в cms.utils.

Для получения большей информации смотрите раздел интренационализация.

3.3. Тэги шаблонов для панели инструментов

Тэг cms_toolbar включается в библиотеку cms_tags и потребует css и javascript в блоках sekizai blocks базавого шаблона. Этот тэг должен быть расположен после тэга <body> и перед первым использованием {% cms_plaseholder%} в вашем  HTML.

Пример:

<body> {% cms_toolbar %} {% placeholder "home" %} ...

 

Оставьте свой комментарий

cultofdigits.com

Шаблоны Django · Django Girls Tutorial

Пришло время отобразить данные на сайте! Django поможет нам с этим при помощи встроенных тегов шаблонов.

Что представляют из себя теги шаблонов?

Как видишь, в HTML нельзя помещать код Python, поскольку браузеры не понимают его. Они знают только HTML. Мы помним, что HTML статичен, в то время как Python позволяет динамические изменения.

Теги шаблонов Django позволяют нам вставлять Python в HTML, так что ты можешь создавать динамические веб-сайты быстрее и проще. То, что надо!

Отображаем шаблон списка записей

В предыдущей главе мы передали нашему шаблону список записей в переменной posts. Теперь мы отобразим его в HTML.

Чтобы вставить переменную в шаблон Django, нам нужно использовать двойные фигурные скобки с именем переменной внутри:

blog/templates/blog/post_list.html

{{ posts }}

Попробуй это в шаблоне blog/templates/blog/post_list.html. Замени всё, начиная со второго <div> и вплоть до третьего </div> кодом {{ posts }}. Сохрани файл и обнови страницу, чтобы увидеть результат:

Как ты можешь заметить, мы получили следующую строку:

blog/templates/blog/post_list.html

<QuerySet [<Post: My second post>, <Post: My first post>]>

Это показывает, что Django понял переменную как список объектов. Помнишь из главы Введение в Python, как мы можем аккуратно отобразить список? Правильно, циклом for! В шаблонах Django ты можешь использовать их таким образом:

blog/templates/blog/post_list.html

{% for post in posts %} {{ post }} {% endfor %}

Попробуй вставить это в свой шаблон.

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

blog/templates/blog/post_list.html

<div> <h2><a href="/">Django Girls Blog</a></h2> </div> {% for post in posts %} <div> <p>published: {{ post.published_date }}</p> <h2><a href="">{{ post.title }}</a></h2> <p>{{ post.text|linebreaksbr }}</p> </div> {% endfor %}

Всё, что ты поместишь между {% for %} и {% endfor %}, будет повторено для каждого объекта в списке. Обнови страницу:

Ты заметила, что мы использовали немного другую запись в этот раз: {{ post.title }} или {{ post.text }}? Мы обращаемся к различным полям нашей модели Post. Также |linebreaksbr прогоняет текст через фильтр для преобразования переносов строк в параграфы.

Ещё один момент

Пришло время ещё раз убедиться, что наш сайт будет работать в сети, согласна? Попробуем развернуть новую версию сайта на PythonAnywhere. Краткий обзор необходимых шагов...

command-line

$ git status [...] $ git add --all . $ git status [...] $ git commit -m "Modified templates to display posts from database." [...] $ git push

PythonAnywhere command-line

$ cd my-first-blog $ git pull [...]

Поздравляем! Теперь попробуй добавить новые записи через панель администратора Django (не забывай указывать published_date!). Удостоверься, что ты в панели администратора своего сайта на PythonAnywhere (https://yourname.pythonanywhere.com/admin). Затем обнови страницу, чтобы проверить, появились ли новые записи.

Работает как по волшебству? Есть чем гордиться! Отойди от компьютера на секунду — ты заслужила перерыв :)

tutorial.djangogirls.org

django - Блог Django CMS - Замена шаблонов для разных случаев

Я не уверен, блог Django CMS - это приложение или фундамент для самостоятельного продления? Я вижу одну огромную логическую ошибку - внутри одной конфигурации приложения я не могу легко изменить шаблон - для списка, деталей, архива и элемента - они строгие и жестко закодированы в коде плагина. Есть ли способ настроить его без взлома приложения/написания множества пользовательских плагинов?

Мне нужно несколько версий для каждого шаблона - особенно для blog_item.html, blog_detail.html и blog_archive.html. Я хочу использовать функцию плагина из CMS и не хочу, чтобы жесткая кодировка всего макета в шаблоне включала логику, потому что это разворачивание MVC-логики (!).

ОК, я знаю, я могу включить свой пользовательский subtemplate blog_item в шаблон списка с экземпляром varibles, но я не могу себе представить, как это сделать в нескольких местах - на главной странице, странице списка, на странице и т.д. НО, используя обычный плагин Django CMS функции - у меня есть статические заполнители и блоки tpl, но все равно есть один шаблон для элемента, внутри кода приложения. Я понимаю (меньше/больше) наследование шаблона Django, но этот случай более сложный, чем простое наследование между шаблонами.

На главной странице мне нужен другой список последних сообщений - один шаблон в списке категорий - другой макет, поэтому следующий шаблон, внутри post-detail_view, должен быть настроен другим способом.

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

Я заменил набор шаблонов, для префикса настроенных шаблонов приложений, а также целую папку со статьями /*.html файлов. Но изменение подменю элемента приводит к тому, что часть макета изменения используется во многих местах одновременно. Это основная проблема. Каждый из них использует плагин "последние сообщения", использует тот же шаблон - и я не могу установить файлы шаблонов для каждого экземпляра плагина.

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

qaru.site

Django | Шаблоны

Создание и использование шаблонов

Последнее обновление: 21.02.2018

Шаблоны (template) отвечают за формирование внешнего вида приложения. Они предоставляют специальный синтаксис, который позволяет внедрять данные в код HTML.

Итак, в прошлых темах был создан следующий проект:

Проект называется hello. И в нем определено одно приложение - firstapp.

Теперь добавим шаблоны. Для этого определим в корневой папке проекта новый каталог templates. Вообще само имя каталога может быть любым, но, как правило, это именно templates. Теперь нам надо указать, что этот каталог будет использоваться в качестве хранилища шаблонов. Для этого откроем файл settings.py. В этом файле настройка шаблонов произодится с помощью переменной TEMPLATES:

TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]

Параметр DIRS задает набор каталогов, которые хранят шаблоны. Но по умолчанию он пуст. Теперь изменим данный кусок кода следующим образом:

TEMPLATE_DIR = os.path.join(BASE_DIR, "templates") TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [TEMPLATE_DIR,], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]

Затем в папке templates определим новый файл index.html со следующим кодом:

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Hello Django</title> </head> <body> <h2>Welcome to Django!</h2> </body> </html>

По сути это обычная веб-страница, которая содержит код html. Теперь используем эту страницу для отправки ответа пользователю. И для этого перейдем в приложении firstapp к файлу views.py, который определяет функции для обработки запроса. Изменим этот файл следующим образом:

from django.shortcuts import render def index(request): return render(request, "index.html")

Из модуля django.shortcuts импортируется функция render.

Функция index вызывает функцию render, которой передаются объект запроса request и путь к файлу шаблона в рамках папки templates - "index.html".

В файле urls.py в главном проекте пропишем сопоставление функции index с запросом к корню веб-приложения:

from django.contrib import admin from django.urls import path from firstapp import views urlpatterns = [ path('', views.index), ]

И запустим проект на выполнение и перейдем к приложению в браузере:

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

Однако в проекте Django нередко бывает несколько приложений. И каждое из этих приложений может иметь свой набор шаблонов. Чтобы разграничить шаблоны для отдельных проектов, можно определять для шаблонов каждого приложения отдельный каталог. Например, в нашем случае у нас одно приложение - firstapp. Для него определим в папке templates каталог firstapp (по имени приложения). И в этом каталоге определим также файл home.html:

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Hello Django</title> </head> <body> <h2>Hello from Home.html!</h2> </body> </html>

Теперь изменим файл views.py в приложении:

from django.shortcuts import render def index(request): return render(request, "firstapp/home.html")

Стоит отметить, что теперь в пути к шаблону также указывается папка, в которой он находится: "firstapp/index.html".

TemplateResponse

Выше для генерации шаблона применялась функция render(), которая является наиболее распространенным вариантом. Однако также мы можем использовать класс TemplateResponse:

from django.template.response import TemplateResponse def index(request): return TemplateResponse(request, "firstapp/home.html")

Результат будет тот же самый.

metanit.com

Django CMS Приступая к работе - Навигация

28 August 2013 г. 11:25:22

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

Для использования любого из этих тэгов вам необходимо подключить {% load menu_tags %}  в вашем шаблоне, перед первым вызовом.

Замечание

Учтите, пожалуйста, что такое меню было разработано, чтобы быть независимым от приложения. Таким образом, меню является меню приложения, а не   cmsapplication.

~cut~

4.1. show_menu

{% show_menu %} отображает навигацию текущей страницы. Вы можете переопределить внешний вид и HTML если добавите в Ваш проект шаблон menu/menu.html или отредактируете один из предоставленных django-cms. show_menu принимает четыре необязательных параметра: start_level, end_level, extra_inactive и extra_active.

Первые два параметра, start_level (по умолчанию 0) и end_level(по умолчанию 100) определяет, с какого уровня навигация будет отображена и на каком уровне должна остановиться. Если у вас есть корневой узел и вы не хотите отображать корневой узел, вы можете отображать навигацию только с первого уровня.

Третий параметр extra_inactive(по умолчанию 0) определяет  оличество уровней навигации, которые будут отображены если узел не является предком или потомком данного.

Четвертый параметр extra_active(по умолчанию 100) определяет количество уровней потомков, которые должны быть отображены после текущего.

Вы можете подставлять параметры шаблона в этот тэг. 

4.1.1. Немного примеров

Полная навигация (как вложенный список):

{%loadmenu_tags%}<ul>   {%show_menu 0 100 100 100%}</ul>

Навигация в виде дерева, начиная с текущего элемента (как вложенный список):

<ul>   {%show_menu 0 100 0 100%}</ul>

Навигация с одним единственным дополнительным уровнем:

<ul>   {%show_menu 0 100 0 1%}</ul>

Навигация с первого элемента(как вложенный список):

<ul>   {%show_menu 1%}</ul>

Навигация с собственным шаблоном:

{%show_menu 0 100 100 100 "myapp/menu.html"%}

4.2. show_menu_below_id

Вы можете указать ID страницы в дополнительных настройках и  Вы сможете отображать подменю этой страницы используя его в тэге шаблона. Например, у нас есть страница которая называется "meta" которая не отображается в навигации и у этой страницы Id “meta”:

<ul>   {%show_menu_below_id "meta"%}</ul>

Вы можете указать некоторые дополнительные параметры так-же как в show_menu:

<ul>   {%show_menu_below_id "meta" 0 100 100 100 "myapp/menu.html"%}</ul>

4.3. show_sub_menu

Отображает подменю текущей странице в виде вложенного списка.

Первый параметр  levels (по умолчанию = 100) определяет количество уровней в глубину подменю, которое должно быть отображено.

Второй параметр root_level (по умолчанию = None) определяет на каком уровне у меню должен быть корневой узел. Например, если root_level = 0 меню начнется с этого уровня, несмотря на то, на каком уровне находится текущая страница.

Третий аргумент nephews(по умолчанию = 100) определяет сколько узлов на данном уровне будут отображены

Шаблоны можно найти в  cms/sub_menu.html:

<ul>   {%show_sub_menu 1 %}</ul>

Начиная с 0-го уровня:

<ul>   {%show_sub_menu 1 0%}</ul>

Или используя собственный шаблон:

<ul>   {%show_sub_menu 1 "myapp/submenu.html"%}</ul>

4.4. show_breadcrumb

Отображает "хлебные крошки" для текущей страницы. HTML шаблон можно найти в файле menu/breadcrumb.html:

{%show_breadcrumb%}

Или используя собственный шаблон, при этом отображая только 2-й уровень и выше:

{%show_breadcrumb 2 "myapp/breadcrumb.html"%}

Если текущий URL не управляется CMS или Вы используете дополнительную навигацию, Вам может понадобиться предоставить собственные  "хлебные крошки" с помощью шаблона. Чаще всего это используется для страниц вроде Входа, Выхода или для страниц сторонних приложений.

4.5. Свойства узлов навигации в шаблонах

{{node.is_leaf_node}}

Является ли узел последним в дереве. Если да, то у него нет потомков. (Как правило приходит из mtpp)

{{node.level}}

Уровень данного узла. Счет начинается с 0.

{{node.menu_level}}

Уровень узла от корневого элемента в меню, начинается с. Если ваше меню начинается с уровня 1 или у вас есть “soft root” (описание в следующей секции) первый элемент по-прежнему вернет 0 в menu_level.

{{node.get_absolute_url}}

Абсолютный URL узла, без протокола, домена и порта.

{{node.title}}

Заголовок узла используя на текущем языке.

{{node.selected}}

Если true, то этот узел выбран для данного URL.

{{node.ancestor}}

Если true, то этот узел является предком данного.

{{node.sibling}}

Если true, то этот узел находится на одном уровне с текущим узлом.

{{node.descendant}}

Если true, то узел является потомком текущего узла.

{{node.soft_root}}

True, елси узел “soft root”.

4.6. Soft Roots

4.6.1. Что делает Soft Root

Soft root - это страница которая для меню навигации ведет себя точно так же как корневая страница.

Обычно, это страница, которая является корневой для определенной секции на вашем сайте.

Когда soft root включен, меню навигации для любой страницы начинается с ближайшей страницы soft root, меньшей, чем корневая станица сайта в иерархии.

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

Например, вы находитесь на странице “Introduction to Bleeding”, таким образом меню может выглядеть так:

очевидно, что это меню избыточно.

Сделая “Department of Mediaeval Surgery” как soft root. меню станет более удобным:

4.6.2. Ипользование Soft Root

Чтобы включить эту настройку в файле settings.py требуется указать:

CMS_SOFTROOT = True

Отметьтестраницу как soft root в дополнительных настройках в панели администратора.

4.7. Изменение и расширение меню

Пожалуйста, обратитесь в раздел  интеграция приложений.

 

Оставьте свой комментарий

cultofdigits.com

django - Как представить данные из пользовательского плагина django-cms в шаблоне

У меня есть пользовательский плагин со следующей структурой. models.py выглядит

class ProductDescription(models.Model): name = models.CharField(max_length=30) icon = models.ImageField(upload_to="installation_image", blank=True, null=True) description = models.TextField(blank=True, null=True) def __unicode__(self): return self.name class ProductPlugin(CMSPlugin): product = models.ForeignKey(ProductDescription) class ProductSpecification(models.Model): product = models.ForeignKey(ProductDescription) specification = models.TextField(blank=True, null=True) class InstallationStep(models.Model): product = models.ForeignKey(ProductDescription) step = models.TextField(blank=True, null=True) image = models.ImageField(upload_to="installation_image", blank=True, null=True)

admin.py

class InstallationStepInline(admin.StackedInline): model = InstallationStep extra = 0 class ProductSpecificationInline(admin.StackedInline): model = ProductSpecification extra = 0 class DeviceAdmin(admin.ModelAdmin): inlines = [ProductSpecificationInline , InstallationStepInline] admin.site.register(ProductDescription, DeviceAdmin)

и cms_plugin.py

class CMSProductPlugin(CMSPluginBase): model = ProductPlugin name = _("Product Description") render_template = "product_description.html" def render(self, context, instance, placeholder): context.update({ 'product':instance.product, 'object':instance, 'placeholder':placeholder }) return context plugin_pool.register_plugin(CMSProductPlugin)

Таким образом, у каждого продукта не может быть никаких или нескольких спецификаций и шагов установки. И вопрос в том, как я могу визуализировать эти спецификации и шаги в шаблоне? Я знаю, как получить данные для класса ProductDescription. Это похоже на

<div>{{ product.description }}</div>

но как я могу извлечь другие данные? я думаю, это должно быть что-то вроде

{% for steps in product.InstallationStep.all %} <div>{{ steps.step }}</div> {% endfor %}

но он ничего не делает = (

Заранее спасибо!

qaru.site


Prostoy-Site | Все права защищены © 2018 | Карта сайта