代码之家  ›  专栏  ›  技术社区  ›  user469652

如何在django-cms中创建文章列表视图

  •  3
  • user469652  · 技术社区  · 11 年前

    我是django cms的绝对初学者,刚刚获得了一些创建模板的知识。只是想知道,如何创建一个在每个不同类别中都有一些活动的门户页面?

    请简单地指出一种实用的方法,不需要真正的代码。

    非常感谢。

    2 回复  |  直到 11 年前
        1
  •  4
  •   Brandon Taylor    11 年前

    正如其他人所指出的,实现这一点的方法是将您的CMS页面挂接到另一组视图。Django CMS提供了应用程序挂钩:

    #cms_app.py
    from cms.app_base import CMSApp
    from cms.apphook_pool import apphook_pool
    
    class YourModuleApp(CMSApp):
        name = 'My App MOdule'
        urls = ['my_app.urls']
    
    apphook_pool.register(YourModuleApp)
    

    因此,如果您有一个名为“my_app”的模块,其中包含urls.py,Django CMS会将这些模式添加到页面中。在admin中的页面“高级设置”部分查找应用程序下拉菜单。

    一旦应用程序连接到页面,Django CMS将从它所保存的信息中提取任何内容和布局模板,然后将处理交给连接到它的其他URL模式。这就是你可以引入另一个模型、添加表单、处理POST等的方法。

        2
  •  2
  •   Flimm Hortitude    8 年前

    你可以用正常的Django方式来做。创建一个普通的Django应用程序,使用一个指向呈现模板的视图的URL。视图可能如下所示:

    from django.shortcuts import render
    from cms.models import Page
    
    def articles(request):
       pages = Page.objects.public()
       render(request, 'example.html', {'pages': pages})
    

    模板可能如下所示:

    {% load cms_tags %}
    {% for page in pages %}
      <p><a href="{{ page.get_absolute_url }}">{% page_attribute "page_title" page %}</a></p>
    {% endfor %}
    

    你可以在这里停下来。或者你可以。。。

    Django CMS与AppHooks的额外集成

    你希望你的非开发人员内容经理能够把文章列表放在他们想要的地方吗?这就是 AppHooks 进来吧

    创建 CMSApp 文件中的类 appname/cms_app.py 这样地:

    from cms.app_base import CMSApp
    from cms.apphook_pool import apphook_pool
    from django.utils.translation import ugettext_lazy as _
    
    class ArticleListApp(CMSApp):
        app_name = 'articlelist'
        name = _('Article List')
    
        def get_urls(self, page=None, language=None, **kwargs):
            return ['articlelist.urls']
    
    apphook_pool.register(YourModuleApp)
    

    删除项目范围内的URL条目 urls.py 因为您不再需要它。您的应用程序 网址.py 需要包含正则表达式的视图 ^$ .

    现在,您或任何具有必要权限的内容管理器用户都可以在管理界面中创建页面,并修改高级设置以选择“文章列表”应用程序:

    Application and Application instance name page settings

    一个棘手的问题是,在页面(以及其所有祖先页面)发布之前,这将无效。