plugin create cms django django-templates django-cms

create - django-cms "vista de resumen" que agrega contenido de varias páginas



django cms linux (1)

Django == 1.5.1 django-cms == 2.4.1

Me gustaría hacer algo así como una vista de resumen de todas las páginas secundarias de una página seleccionada en django-cms, extraer el título, el contenido truncado, etc. con un enlace más ... para cada niño de la lista. Logré obtener títulos y rutas muy bien, pero estoy luchando por obtener contenido de los marcadores de posición.

Tengo una plantilla como esta:

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}

y aquí está la plantilla que está usando:

{% 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>

¿Alguien puede ayudarnos a obtener el contenido del marcador de posición aquí? Lo ideal es que pueda pasarlo a través de truncatewords_html para obtener un resumen, pero abierto a otras formas para obtener el mismo efecto.

Gracias por cualquier consejo / punteros!


Tuve que indexar el contenido de CMS en un proyecto y obtuve el contenido de cada marcador de posición, y el contenido de un marcador de posición se almacena en los complementos adjuntos.

¿Cómo se obtiene el contenido de un CMSPlugin en una vista?

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

Si desea administrar otros complementos como PicturePlugin , puede obtener el texto "alt" como:

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

¿Cómo obtener el contenido de CMSPlugin en una plantilla?

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

Supongo que cuando quieres obtener el contenido, estamos hablando de TextPlugin , debes tener cuidado aquí porque solo el plugin tipo TextPlugin tiene el body del atributo, PicturePlugin tiene el atributo alt y LinkPlugin tiene el atributo href etc ...

Solución adaptada para su problema

Está haciendo un bucle sobre los marcadores de posición , por lo que debe obtener todos los complementos para cada marcador de posición y obtener el contenido de cada complemento, porque el contenido de los marcadores de posición que mencioné anteriormente se almacena en los complementos adjuntos (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 %} ... ... ...

Y para garantizar que solo muestre el contenido de TextPlugin y no de otros complementos, puede hacer lo siguiente:

... ... ... {% 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 %} ... ... ...