如何在django-cms中从每个页面访问所有页面对象?

9 投票
4 回答
9032 浏览
提问于 2025-04-16 08:09

我正在使用Django CMS 2.1.0.beta3,遇到了一个问题。我需要把所有页面放在一个变量里,这样我就可以用循环来创建我的导航菜单。Django CMS自带的show_menu功能不适合我现在的需求。

我需要一个包含所有页面的查询集,这样我就可以做类似下面的事情:

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

有没有人知道我怎么才能获取到所有已发布页面的对象呢?

4 个回答

1

你可以使用页面模型来获取所有已发布的页面。

Page.objects.published()

你可以在你的视图或插件中使用这个方法。

祝好,
Miro
migaat.blogspot.com

3

根据文档,你应该使用:

Page.objects.public()

来源:https://github.com/divio/django-cms/blob/support/2.4.x/cms/models/managers.py#L31

13

我最后通过在Django中创建一个模板标签来解决这个问题,这个标签可以显示所有的CMS页面:

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)

然后在模板中,你可以这样调用这个模板标签:

{% load navigation_tags %} {% cms_navigation %}

这需要你先创建一个main-navigation.html文件。在这个文件中,HTML内容会被插入到模板的相应位置,而main-navigation.html也能访问到在自定义标签函数中传递给它的任何内容:

templates/main-navigation.html:

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

希望这能帮助一些人更好地理解模板标签。我觉得关于这个主题的文档有点让人困惑。

撰写回答