django cms [aldryn newsblog] 替换插件模板

Posted

技术标签:

【中文标题】django cms [aldryn newsblog] 替换插件模板【英文标题】:django cms [aldryn newsblog] replace template for plugin 【发布时间】:2016-04-20 10:36:50 【问题描述】:

我需要在不同的子页面上替换相同的插件模板 - 例如在首页我需要最新文章的特定滑块模板,详细文章我需要小列表,没有图像的搜索结果等。 [注意:关于aldryn 新闻博客应用的一切——我不是指我自己的插件!]

*(类似于每个插件实例的自定义模板)

如何更换?扩展模板并不是我所需要的——继承是从底部开始的——从较低的子模板到 base.html——但该插件已经硬编码了较低的模板。

模板中的大量 IF 块是不合理的,然后我们认为在 MVC 中。 *(喜欢这里Render Django-CMS plugins differently on different splaceholders/templates)

或者也许只是使用硬编码的插件编写自定义模板?但是使用 django cms 占位符编辑器非常有用,最好继续以这种方式工作 :///

所以,我为首页创建了 front.html 基本模板, 将一些插件放在占位符上 - 并且只需要在这个 front.html 中替换此插件的子模板,并将该插件的子模板保留在其他地方 - 这是主要目标。

这将是最好的,当 django cms/aldryn 新闻博客为每个插件实例提供选项“自定义模板”时:| (喜欢这个http://www.ilian.io/django-cms-plugins-with-selectable-template/)

【问题讨论】:

【参考方案1】:

如果我正确理解了您的问题(这里已经很晚了),您需要一种基于插件实例覆盖插件模板的方法,因为破解 django 模板不是可行的方法(我同意)。

Django CMS 确实允许您基于实例覆盖插件模板。 如图http://docs.django-cms.org/en/develop/how_to/custom_plugins.html?highlight=get_render_template#the-simplest-plugin

在您的 CMSPluginBase 子类中添加以下内容:

  def get_render_template(self, context, instance, placeholder):
      # criteria goes here
      return 'sometemplate.html'

至于如何知道何时(条件)渲染哪个模板,您可以做一些事情。

使用页面的反向 id:

page = instance.page

templates = 
    'homepage': 'plugin_home.html',
    'about': 'plugin_about.html',
    'contact': 'plugin_contact.html',

return templates[plugin.page.reverse_id]

这种方法有一些缺点:

依赖于绑定到页面的插件。 (插件可以存在于页面之外) 只能用于设置了反向 ID 和反向 ID 的页面 每页都是唯一的,这意味着您必须列出反向 id 对于您要为其更改模板的每个页面。

使用 page 扩展来设置每个页面的类别:

结帐http://docs.django-cms.org/en/develop/how_to/extending_page_title.html 使用这种方法,您可以为多个页面设置某种类别,这样您就可以一次定位多个页面,如下所示:

    page = instance.page
    extension = get_page_extension(page) # Check out docs for this
    templates = 
        'category_1': 'plugin_category_1.html',
        'category_2': 'plugin_category_2.html',
        'category_3': 'plugin_category_3.html',
    
    return templates[extension.category.name]

优点:

可以一次定位多个页面

缺点:

依赖插件绑定到页面。 有点复杂

使用模板上下文变量: 在您的模板中,根据您呈现插件的方式,您可以 像这样提供一个上下文变量:

% with category='category_1' %
% placeholder 'content' %
% endwith %

% with category='category_1' %
% render_plugin yourplugin %
% endwith %

然后在您的 get_render_template 方法中,您可以访问此上下文变量并执行以下操作:

# Use .get() to provide fallback
category = context['category']

templates = 
   'category_1': 'plugin_category_1.html',
   'category_2': 'plugin_category_2.html',
   'category_3': 'plugin_category_3.html',

return templates[category]

优点:

没有额外的模型。 可以一次定位多个页面。

缺点:

我唯一能想到的就是这些随机的% with % in 模板。

我完全错过了新博客部分,所以为了覆盖新闻博客插件或任何插件,只需将要覆盖的插件类子类化并取消注册原始插件,然后注册你的,确保你的插件具有相同的类名。

也许您可以将上面的整个模板逻辑制作成一个 mixin,以便在整个项目中使用。

【讨论】:

一件事——不是“我的插件”,而是 Aldryn NewsBlog 应用程序提供自己的插件——我需要调整输出。所以最好的解决方案是动态替换 render_template - 在模板或类似的东西中 - 但我无法破解 Aldryn NewsBlog 应用程序代码。所以唯一的方法是通过模板或自定义应用程序扩展 NewsBlog。 如果您打算在多个应用程序上执行此操作,我建议您按照答案中的说明更换插件。这样你只覆盖渲染的模板而不是其他任何东西,所以升级会容易得多。 嗯,你能推荐任何 django cms 的博客/文章插件吗?我需要为我的网站编写一些应用程序,所以像博客这样的基本应用程序和我想使用的文章发布 - 新闻博客看起来不错,但我有很多问题 - 有时会有很多错误和奇怪的逻辑。 如果你能在 github 上提交 newsblog 的 bug 就好了,除此之外还有 djangocms-blog 是的,我知道,我已经发布到问题队列了。 DjangoCMS Blog 是太小的应用程序 - 并且只提供博客功能 - NewsBlog 很适合多应用程序配置,让我有机会分开(部分只......)博客和文章部分。无论如何,我想我会为此编写自己的应用程序:/【参考方案2】:

我一直想看看 Zinnia,但我现在在一个网站上与 NewsBlog 合作太远了(并且已经发布了博客等等)。您总是可以在模板中添加一些额外的占位符(这不是最有效的看起来的东西,但如果您添加一个占位符并将其留空,它不会对框架造成任何负担),这样他们不是静态的,然后您可以将任何您想要的插件放入其中。您可以通过在结构模式中添加您想要的任何内容来非常轻松地自定义 NewsBlog 中的每个组件。当涉及到多个不同行为的博客时,事情会变得更加棘手,但即便如此,只要你不将组件添加到 NewsBlog 提供的静态占位符中(或者正如我如此优雅地学习的那样,“不要把这些东西在带有大头针的块状事物中),您可以为不同的博客创建不同的命名空间(在管理员中,在 NewsBlog 部分的“配置”下,或者在创建新页面并将其连接到 NewsBlog 应用程序时) ),并且您可以在不同的博客上使用不同的模板。

编辑:这是一个非常好的资源,可以在不把婴儿和洗澡水一起扔掉的情况下修改 NewBlog(在学习 DjangoCMS 三个月后,我仍然发现自己参考它来微调 NewsBlog 的片段,并刷新我掌握了模板标签和其他压倒性的东西,并且很快就离开了我的大脑):https://www.django-cms.org/en/blog/2016/02/16/build-a-website-without-knowing-python-django-part-two/

*我链接到第二部分,因为第一部分涉及如何最初设置项目,我认为它可能不相关。再说一次,如果您使用的是 Aldryn,那么如果您在自定义样板时遇到问题(或您想为您配置 Aldryn 设置处理的其他事情 - 其中有一些有用的位可以推断)大多数时候都超级棒,但是当它不是超级棒时,通常会非常令人沮丧:)

【讨论】:

不知道为什么会被否决(我还在学习,所以我真的很想知道我是否偏离了这种方法!),但是 NewsBlog 文章搜索插件,代码here,是使用 Angelo Dini 的 class.js javascript 框架制作的;可能值得研究框架的 plugin creation abilities ,它们似乎是扩展 NewsBlog 的一种非常无缝的方式。

以上是关于django cms [aldryn newsblog] 替换插件模板的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu Virtualbox 中 Pycharm 中的 Python 控制台无法连接

无法导入名称六 Django-CMS

Django-CMS - 当我指定模型时,管理员的 CMS 部分消失

将现有的 django 应用程序与 django-cms 集成

django-cms 和 jQuery

Django CMS 教程