【问题标题】:How to access template block from plugin within Django CMS Placeholder如何从 Django CMS 占位符中的插件访问模板块
【发布时间】:2017-01-04 13:48:48
【问题描述】:

我有以下代码:

base.html

<html>
...
{% block test_block %}
    {# Some stuff to render #}
{% endblock %}
...
</html>

ma​​in_template.html

{% extends "base.html" %}    
...
{% block content %}
    {% placeholder "content" %}
{% endblock %}
...

plugin.html

...

如果我将我的插件添加到它在占位符块中呈现的页面,正如预期的那样。

如果我修改 plugin.html 以添加以下内容:

plugin.html

...
{% block test_block %}
    {{ block.super }}
    {# Some more stuff to render #}
{% endblock %}
...

然后我收到一个错误:
'BlockNode' 对象没有属性 'context'。您是否在基本模板中使用了 {{ block.super }}?

如果我尝试从 plugin.html 中扩展 main_template.html 或 CMS_TEMPLATE(它们似乎相同?),我会收到以下错误:
调用 Python 对象时超出最大递归深度

如何从我的插件中访问并附加到 test_block?

【问题讨论】:

  • 插件是从什么扩展而来的?
  • 据我所知,没有。 plugin.html 顶部没有 {% extends %} 标记,但添加一个会导致最大递归深度错误

标签: django django-cms


【解决方案1】:

我相信,为了使用块,您必须在从定义该块的模板扩展的模板中这样做。

但是,为了做你想做的事,CMS 使用了django-sekizai。

有了这个,你就可以在base.html拥有这个;

{% load sekizai_tags %}
<html>
    ...
    {% render_block "test_block" %}
    ...
</html>

然后在plugin.html 你就可以了;

{% load sekizai_tags %}
{% addtoblock "test_block" %}
    Add this to my block
{% endaddtoblock %}

这通常用于 CSS 和 JS 块,但非常适合您想做的事情。

【讨论】:

  • 谢谢你,马克,我会试试这个。我想我不确定的是,在占位符中呈现的插件是否隐式地扩展了它们的父级(在我的例子中是 main_template.html)。我会尝试使用 django-sekizai 并在几天后回复您。
  • 那么您的插件可以在任何页面上使用,并且您可能有针对不同类型页面的各种页面模板。 Sekizai 非常适合将 JS 或 CSS 包含在特定于插件的 base.html 中,因此它应该可以满足您的需求。
  • @AndyF 你是怎么做到的?
  • 嗨,马克,感谢您回复我。抱歉耽搁了。 Django Sekizai 的工作就像一个魅力。
猜你喜欢
  • 2015-05-20
  • 2017-09-19
  • 2012-10-10
  • 2013-09-26
  • 2015-05-21
  • 2016-05-04
  • 2013-10-18
  • 2015-09-09
  • 2019-09-02
相关资源
最近更新 更多