我是django-cms的绝对初学者,刚刚获得了一些知识来创建模板。只是想知道,如何创建一个在每个不同类别中都有少量粒子的门户页面?
请简单指出一种实用的方法,不需要真正的代码。
谢谢。
答案 0 :(得分:4)
正如其他人所指出的,这样做的方法是将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等等。
答案 1 :(得分:2)
你可以用正常的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 %}
你可以在这里停下来。或者你可以......
您是否希望您的非开发人员内容管理员能够在任何他们想要的位置放置文章列表?这是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)
删除项目范围urls.py
中的网址条目,因为您不再需要它。您的应用urls.py
需要包含正则表达式^$
的视图。
现在,您或具有必要权限的任何内容管理员用户都可以在管理界面中创建页面,并修改高级设置以选择“文章列表”应用程序:
一个问题是,在页面发布之前(以及它的所有祖先页面),这将无效。