2010-12-07 5 views
7

Ich benutze Django CMS 2.1.0.beta3 und stoße auf ein Problem. Ich muss Zugriff auf alle Seiten in einer Variablen haben, damit ich sie durchlaufen kann und mein Navigationsmenü mit einer for-Schleife erstellen kann. Die mit django cms zur Verfügung gestellte Funktion show_menu funktioniert nicht für das, was ich gerade mache.Wie greife ich von jeder Seite aus auf alle Seitenobjekte in django-cms zu?

Ich brauche eine queryset mit allen Seiten, damit ich etwas Ähnliches wie das folgende tun:

{% for page in cms_pages %} 
    {{ page.title }} 
{% endfor %}  

Wer weiß, wie ich den Zugriff auf alle veröffentlichten Seite Objekte wie die auf ALLE Seiten gewinnen können?

Antwort

10

ich am Ende dieses Problem zu lösen, indem ein TemplateTag in django zu schaffen, die alle serviert der CMS-Seiten:

app/template_tags/navigation_tags.py:

from django import template 
from cms.models.pagemodel import Page 

register = template.Library() 

def cms_navigation(): 
    cms_pages = Page.objects.filter(in_navigation=True, published=True) 
    return {'cms_pages': cms_pages} 

register.inclusion_tag('main-navigation.html')(cms_navigation) 

Dann in den Vorlagen rufen Sie die Template-Tag wie folgt:

{% load navigation_tags %} {% cms_navigation %} 

Dies erfordert, dass Sie eine Haupt navigation.html Datei erstellt haben. Hier wird dann der HTML-Code aus dieser Vorlage in die Vorlage eingefügt, wo auch immer sich das Tag befindet, und die Hauptnavigation.html hat Zugriff auf alles, was in der benutzerdefinierten Tag-Funktion übergeben wurde:

templates/main-navigation.html :

<ul id="navigation"> 
    {% for page in cms_pages %} 
     {{ page.get_title }} 
    {% endfor %}  
</ul> 

Ich hoffe, dass dies jemand besser hilft, TemplateTags zu verstehen. Ich fand die Dokumentation zu diesem Thema etwas verwirrend.

1

Sie können das Seitenmodell verwenden, um alle veröffentlichten Seiten zu erhalten.

Page.objects.published() 

Sie können dies in Ihren Ansichten oder Plugins verwenden

Grüße Miro migaat.blogspot.com

+1

Ich weiß, Sie können dies tun, aber wie mache ich das für alle Seitenvorlagen? – thomallen

1

Sie müssen dies hinzufügen, in dem Sie die Seite möchten.

{{ request.current_page }} 

Das funktionierte für mich. Sie müssen möglicherweise {% load staticfiles %} irgendwo in Ihrem Code enthalten

Verwandte Themen