Сводный просмотр django-cms, объединяющий контент с нескольких страниц

Django == 1.5.1 django-cms == 2.4.1

Я хотел бы сделать что-то вроде сводного представления всех дочерних страниц выбранной страницы в django-cms, вытягивая заголовок, усеченный контент и т. Д. С дополнительной ... ссылкой для каждого перечисленного дочернего элемента. Мне удалось получить заголовки и пути очень хорошо, но я изо всех сил пытаюсь получить контент из заполнителей.

У меня есть такой шаблон:

from cms.models import Page
from cms.utils.page_resolver import get_page_from_path

from django import template


register = template.Library()


@register.inclusion_tag('news_summary_item.html')
def get_news_items():
    news_root = get_page_from_path('news')
    newsitems = news_root.children.filter(published=True)
    return {'newsitems':newsitems}

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

{% load cms_tags menu_tags %}
<ul>
{% for item in newsitems %}
    <li><a href="/{{ item.get_path }}">{{ item.get_title }}</a>
        {% for placeholder in item.placeholders.all %}
            # {% show_placeholder placeholder.slot item current_language %} #
        {% endfor %}
    </li>
{% endfor %}
</ul>

Может ли кто-нибудь помочь с получением содержимого заполнителя здесь? В идеале id хотел бы иметь возможность передать его через truncatewords_html, чтобы просто получить сводку, но открыт для других способов получить тот же эффект.

Спасибо за любые советы / указатели!


person captainmish    schedule 09.05.2013    source источник
comment
У меня работает, обязательно поместите placeholder_tags в свой {% load ... %} и используйте {% render_placeholder placeholder %} в цикле шаблона.   -  person mkoistinen    schedule 09.05.2013
comment
Спасибо за это. Мне нужно было сделать то же самое, и я понятия не имел, с чего начать!   -  person Yablargo    schedule 07.09.2013
comment
get_page_from_path больше нет на cms.utils.page_resolver, он был перемещен в cms.utils.page (я использую djangocms 3.7)   -  person sodimel    schedule 28.10.2019
comment
github.com/django-cms/ django-cms / blob / development / cms / utils /   -  person javed    schedule 21.01.2021


Ответы (1)


Мне пришлось проиндексировать содержимое CMS в одном проекте, и я получаю содержимое каждого заполнителя, а содержимое заполнителя хранится в прикрепленных к нему плагинах.

Как получить содержимое CMSPlugin в представлении?

from cms.models import CMSPlugin

plugin = CMSPlugin.objects.filter(plugin_type='TextPlugin')[0]  # Get first text plugin
# This return the body/content of the plugin:
plugin_content = plugin.get_plugin_instance()[0].body 

Если вы хотите управлять другими плагинами, такими как PicturePlugin, вы можете получить текст «alt», например:

plugin_picture_content = plugin.get_plugin_instance()[0].alt

Как получить содержимое CMSPlugin в шаблоне?

# plugin_object containing a CMSPlugin
{{plugin_object.get_plugin_instance.0.body}}

Я предполагаю, что когда вы хотите получить контент, мы говорим о TextPlugin, вы должны быть осторожны здесь, потому что только тип плагина TextPlugin имеет атрибут body, PicturePlugin имеет атрибут alt, а LinkPlugin имеет атрибут href и т. Д.

Решение, адаптированное к вашей проблеме

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

...    ...    ...
{% for placeholder in item.placeholders.all %}  # Loop over placeholders
    {% for plugin in placeholder.get_plugin_list %}  # Get plugins for each placeholder
        {{plugin.get_plugin_instance.0.body|striptags}}
    {% endfor %}
{% endfor %}
...    ...    ...

И чтобы убедиться, что вы показываете только содержимое TextPlugin, а не из других плагинов, вы можете:

...    ...    ...
{% for placeholder in item.placeholders.all %}  # Loop over placeholders
    {% for plugin in placeholder.get_plugin_list %}  # Get plugins for each placeholder
        {% if 'TextPlugin' in plugin.plugin_type %}
            {{plugin.get_plugin_instance.0.body|striptags}}
        {% endif %}
    {% endfor %}
{% endfor %}
...    ...    ...
person AlvaroAV    schedule 01.09.2014