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

时间:2016-01-14 22:16:02

标签: django templates django-cms

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

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

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

模板中的IF块数量是不合理的,然后我们在MVC中思考。 *(例如Render Django-CMS plugins differently on different splaceholders/templates}

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

所以,我为frontpage创建了front.html基本模板, 将一些插件添加到占位符 - 并且需要仅在此front.html中替换此插件的子模板,并在其他位置保留该插件的子模板 - 这是主要目标。

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

2 个答案:

答案 0 :(得分:0)

如果我正确理解你的问题(这里已经很晚了),你需要一种方法来基于插件实例覆盖插件模板,因为黑客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部分,所以为了覆盖newsblog插件或任何插件,只需将要覆盖的插件类子类化并取消注册原始然后注册你的,确保你的类名相同。 / p>

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

答案 1 :(得分:-2)

我一直想给Zinnia看一看,但我现在在网站上使用NewsBlog做得太过分了(并且已经发布了博客等等)。你总是可以在模板中添加一些额外的占位符(它不是最有效的看起来的东西,但是如果你添加一个占位符,那么它对框架没有任何负担保持空白),这样他们就不会是静态的,然后你可以把你想要的任何插件放在里面。您只需在结构模式中添加所需内容,即可轻松自定义NewsBlog中的每个组件。当涉及到多个博客采取不同的行为时,事情会变得更加棘手,但即便如此,只要您不将组件添加到NewsBlog提供的静态占位符中(或者我如此优雅地学习它," don&将这些东西放在他们旁边的引脚的块状物中,你可以为不同的博客创建不同的命名空间(在管理员中,在#34; Configs"在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设置的其他内容),那么可以推断出一些有用的内容。处理你 - 大多数时候都非常棒,但是当它不是超级棒的时候,它通常会让人非常沮丧:)