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