将Django CMS项目作为单页应用程序(SPA)运行
djangocms-spa的Python项目详细描述
将Django CMS项目作为单页应用程序(SPA)运行。这个包提供了一个rest-api,它返回 页面内容序列化为json。可以使用两个helper和基类为 自定义视图。djangocms-spawas build to use it with a concrete implementation:
快速启动
安装djangocms_spa:
pip install djangocms-spa
将其添加到您的INSTALLED_APPS:
INSTALLED_APPS=(...'djangocms_spa',...)
添加区域设置中间件(如果尚未添加):
MIDDLEWARE=(...'django.middleware.locale.LocaleMiddleware',)
设置默认模板:
DJANGOCMS_SPA_DEFAULT_TEMPLATE='pages/content.html'
设置变量DJANGOCMS_SPA_TEMPLATES需要模板字典。它应该覆盖所有模板 使用路径作为键。前端组件名称和部分列表 (例如静态占位符)是有效的选项。
DJANGOCMS_SPA_TEMPLATES={'pages/content.html':{'frontend_component_name':'content','partials':['menu','meta','footer']},'pages/content_with_section_navigation.html':{'frontend_component_name':'content-with-section-navigation','partials':['menu','meta','footer']},}
配置自定义部分:
DJANGOCMS_SPA_PARTIAL_CALLBACKS={'menu':'djangocms_spa.partial_callbacks.get_cms_menu_data_dict'}
插件
插件不需要呈现模板,只需要返回字典的render_spa方法。干净利落 结构,我们通常将上下文放在字典的content键中:
classTextPlugin(JsonOnlyPluginBase):name=_('Text')model=TextPluginModelfrontend_component_name='cmp-text'defrender_spa(self,request,context,instance):context=super(TextPlugin,self).render_spa(request,context,instance)context['content']['text'].=instance.textreturncontextplugin_pool.register_plugin(TextPlugin)
设置
CACHE_TIMEOUT(默认值:60 * 10)
如果使用的是缓存后端,则会缓存API响应。
DJANGOCMS_SPA_DEFAULT_TEMPLATE(默认值:'index.html')
DEFAULT_LIST_CONTAINER_NAME(默认值:'object_list')
列表视图使用此键对其数据进行分组。
CMS_PAGE_DATA_POST_PROCESSOR(默认值:None)
此钩子允许您通过定义模块路径后处理cms页面的数据。
PLACEHOLDER_DATA_POST_PROCESSOR(默认值:None)
此钩子允许您通过定义模块路径后处理占位符的数据。
部分
我们将用于呈现模板的全局页面元素称为“部分”。部分的内容不 从一页改到另一页。在django cms项目中,部分被实现为静态占位符。因为我们 不呈现任何HTML模板,我们需要为中的每个模板配置静态占位符 DJANGOCMS_SPA_TEMPLATES作为部分。要编辑占位符和静态占位符数据,需要同时呈现 在编辑模式下:
{% if request.toolbar.edit_mode %} {% placeholder "main" %} {% static_placeholder "footer" %} {% endif %}
通常还有其他部分,如菜单或任何其他模板标记,其工作原理与静态占位符非常相似。 因为我们没有允许呈现模板标记的模板,所以需要为 这些需要。我们决定使用回调方法,允许开发人员将自定义数据带到 列表。通过添加部分键和 回调函数。您可以在djangocms_spa/partial_callbacks.py中找到一个示例。你的函数应该返回 像这样的字典:
{ 'type': 'generic', 'content': { 'my_var': 1 } }