[转] http://www.codingsoho.com/zh/blog/djangocms-apphook-serial-app/python
前言
在http://www.codingsoho.com/zh/blog/djangocms-plugin-integrate-serail-app/一文里,咱们介绍了如何使用插件来添加专题内容、django
若是使用普通应用,须要添加对应的URL,那么访问该页时会转向该应用。若是用插件,那么不须要特别指定URL,它将会做为页面的一部分添加。服务器
若是咱们想让应用附着在某个页面上而不须要特别为它设定URL,效果就像前面介绍的News&Blogs,该怎么作呢?用apphooks,下面就将介绍如何在咱们的djangoCMS项目中添加这个专题应用。app
建立apphooks
建立CMSApp子类,它会告诉CMS如何来引入这个应用。这个类应该写在文件cms_apps.py文件里,该文件须要新建。url
from cms.app_base import CMSApp from cms.apphook_pool import apphook_pool from django.utils.translation import ugettext_lazy as _ @apphook_pool.register # register the application class SerialsApphook(CMSApp): app_name = "serials" name = _("Serial Application") def get_urls(self, page=None, language=None, **kwargs): return ["serials.urls"]
这些字段以下:spa
- app_name属性,CMS系统里指向钩子应用的名字
- name 是管理员用户可读的名字
- get_urls()实际上会将应用hook进,返回URL列表,这样咱们就不须要本身在项目的URL里添加该应用的URL,CMS会来处理
重启服务器runserver。新建文件只有在重启服务器以后才会被加载,只有新建文件时才须要这样作。.net
将应用挂钩到某个页面上
如今咱们须要建立一个页面,而且经过apphook将这个应用附着到这个页面上。插件
建立页面 http://127.0.0.1:8000/zh/course1code
注意:页面须要首先发布而后才能使用这个apphookserver
这时候打开页面高级设置,能够看到应用的选择框里面多了刚才咱们添加的Serial Application
选择保存后刷新网页,就能够看到跟访问http://127.0.0.1:8000/zh/course同样的效果了。
如今咱们能够将下面语句从项目URL (csblog.urls)里删除了, CMS会处理这个URL,不须要额外指定。
url(r'^course/', include('serials.urls')),
要注意的是:钩子应用的URL名字是有namespace的,必定要加上,不然会提示不存在。
class Serial(models.Model): def get_absolute_url(self): return reverse("serials:serial_detail", kwargs={"pk":self.pk})
另外,不能给子页添加apphook。
官方文档:
The apphook “swallows” all URLs below that of the page, handing them over to the attached application. If you have any child pages of the apphooked page, django CMS will not be able to serve them reliably.