2013-05-09 8 views
6

Django == 1.5.1 django-cms == 2.4.1django-CMS "schermata Sommario" aggregazione di contenuti da più pagine

Mi piacerebbe fare qualcosa di simile a una visualizzazione di riepilogo di tutte le pagine figlio di una pagina selezionata in django-cms, estraendo titolo, contenuto troncato ecc. con un link più ... per ogni bambino elencato. Sono riuscito a ottenere titoli e percorsi semplicemente bene, ma sto lottando per ottenere contenuti dai segnaposto.

Ho un templatetag come questo:

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} 

e qui è il modello con la sua:

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

chiunque può aiutare a ottenere il contenuto segnaposto qui? Idealmente, id vuole essere in grado di passarlo attraverso truncatewords_html per ottenere solo un sommario, ma aperto ad altri modi per ottenere lo stesso effetto.

Grazie per eventuali suggerimenti/suggerimenti!

+1

funziona per me, essere sicuri di mettere nel vostro placeholder_tags '{carico% .. .%} 'e usa' {% render_placeholder placeholder%} 'nel tuo ciclo di template. – mkoistinen

+0

Grazie per questo.Avevo bisogno di fare esattamente la stessa cosa e non avevo idea da dove cominciare! – Yablargo

risposta

0

ho dovuto indice di contenuto CMS in un progetto e ottengo il contenuto di ogni segnaposto, e il contenuto di un segnaposto viene memorizzato nella plugin collegato ad esso

Come te ottenere il contenuto di un CMSPlugin in 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 

Se si desidera gestire altri plugin come PicturePlugin si potrebbe ottenere il testo "alt", come:

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

Come ottenere il contenuto di CMSPlugin in un modello?

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

I supose quando si vuole ottenere il contenuto, stiamo parlando di TextPlugin, devi essere attento qui perché solo il tipo plug TextPlugin ha l'attributo body, il PicturePlugin ha l'attributo alt e la LinkPlugin ha l'attributo href ecc ...

soluzione adatta per il vostro problema

state facendo un cappio oltre segnaposto, quindi è necessario ottenere tutti i plugin per ciascun segnaposto e ottenere il contenuto di ogni plugin, perché il contenuto dei segnaposto come ho detto prima sono memorizzati nei plugin collegato ad esso (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 %} 
... ... ... 

E per garantire che si mostra solo il contenuto di TextPlugin e non da altri plugin che si possa fare:

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