Django CMS [Aldryn Newsblog] 替换插件的模板



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

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

如何更换?扩展模板不是我需要的 - 继承是从底部 - 从较低的子模板到基础.html - 但该插件已硬编码较低的模板。

模板中的大量 IF 块是不合理的,那么我们在 MVC 中认为。*(就像这里在不同的占位符/模板上以不同的方式渲染 Django-CMS 插件)

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

///

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

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

如果我正确理解了您的问题(这里已经晚了),您需要一种方法来在插件实例的基础上覆盖插件模板,因为黑客 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对于要更改模板的每个页面。

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

结帐 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 %}模板。

我完全错过了newblog部分,所以为了覆盖新闻博客插件或任何插件,只需对要覆盖的插件类进行子类化并注销原始插件类,然后注册您的插件类,请确保您的类名相同。

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

我一直想看看 Zinnia,但我现在在一个网站上与 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 设置为您处理的其他内容),则可以推断出一些有用的位 - 这在大多数情况下都非常棒,但是当它不是超级棒时,它通常是超级令人沮丧的:)

最新更新