来自模板变量的 Django-cms 占位符命名
Django-cms Placeholder naming from template variable
我正在努力生成一个菜单,允许用户将图像和文本描述上传到菜单的每个子部分。这是当前代码(用于显示菜单的自定义模板):
{% for lowest in lower.children %}
{% with lowest.get_menu_title as title %}
<div id="product_box">
<div id="product_image">
{% placeholder title %}
</div>
</div>
<div id="product_summary">
<h3>
<a href="{{ lowest.attr.redirect_url|default:lowest.get_absolute_url }}">
{{title}}
</a>
</h3>
<p>
{% placeholder "Text" %}
<a href="{{ lowest.attr.redirect_url|default:lowest.get_absolute_url }}">Learn More</a>
</p>
</div>
{% endwith %}
{% endfor %}
(现在不要担心 {% 占位符 "Text" %},我只是还没有更改那部分,因为我无法让前者工作)。
页面呈现,但唯一可见的插件是 "TITLE" 和 "Text"(同样,不用担心 "text")。
我没有找到任何说明占位符不能使用变量命名的文档,但到目前为止我已经尝试了所有的方法,从 {{title}} 到 {% placeholder lowest.get_menu_title %} 全部似乎只是将它们解释为字符串,分别显示 {{TITLE}} 或 LOWEST.GET_MENU_TITLE 作为占位符名称。
所以,我的问题是:我可以将模板中的变量名称分配给占位符(以便我可以根据菜单名称在 for 循环中生成唯一的占位符)吗?
从此处查看代码库:https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py#L284 占位符模板标记的 'name' 参数似乎始终被解释为字符串,因此,它目前不能是变量赋值。
它不完全清楚你打算在这里做什么,但我想知道你是否应该考虑使用 django 模型来表示你所有的各种实例,然后使用 PlaceholderField (http://django-cms.readthedocs.org/en/support-3.0.x/how_to/placeholders.html)。您仍然无法通过模板变量 define/reference 占位符,但您可以随后遍历您的实例并依次显示它们的 PlaceholderField。
希望对您有所帮助。
如果可以使用静态占位符,您可以使用 add 内置模板过滤器来构建字符串,然后将其传递给占位符标记。
例如:
{% static_placeholder title|add:"-placeholder" %}
有一个解决方法:
{% with child.title as name %}{% static_placeholder name %}{% endwith %}
我用它来将可自定义的链接添加到导航栏菜单中。
结果出奇的稳定。
现在我已经为我们的设计师创建了一个私人页面来自定义菜单。
在页面上获取从 {% show_menu %}
生成的列表,一个包含实际的导航栏模板和一个包含预定义占位符的列表。
遗憾的是,这些占位符必须预定义,因为模板中的占位符不会在结构板中呈现
我正在努力生成一个菜单,允许用户将图像和文本描述上传到菜单的每个子部分。这是当前代码(用于显示菜单的自定义模板):
{% for lowest in lower.children %}
{% with lowest.get_menu_title as title %}
<div id="product_box">
<div id="product_image">
{% placeholder title %}
</div>
</div>
<div id="product_summary">
<h3>
<a href="{{ lowest.attr.redirect_url|default:lowest.get_absolute_url }}">
{{title}}
</a>
</h3>
<p>
{% placeholder "Text" %}
<a href="{{ lowest.attr.redirect_url|default:lowest.get_absolute_url }}">Learn More</a>
</p>
</div>
{% endwith %}
{% endfor %}
(现在不要担心 {% 占位符 "Text" %},我只是还没有更改那部分,因为我无法让前者工作)。 页面呈现,但唯一可见的插件是 "TITLE" 和 "Text"(同样,不用担心 "text")。
我没有找到任何说明占位符不能使用变量命名的文档,但到目前为止我已经尝试了所有的方法,从 {{title}} 到 {% placeholder lowest.get_menu_title %} 全部似乎只是将它们解释为字符串,分别显示 {{TITLE}} 或 LOWEST.GET_MENU_TITLE 作为占位符名称。
所以,我的问题是:我可以将模板中的变量名称分配给占位符(以便我可以根据菜单名称在 for 循环中生成唯一的占位符)吗?
从此处查看代码库:https://github.com/divio/django-cms/blob/develop/cms/templatetags/cms_tags.py#L284 占位符模板标记的 'name' 参数似乎始终被解释为字符串,因此,它目前不能是变量赋值。
它不完全清楚你打算在这里做什么,但我想知道你是否应该考虑使用 django 模型来表示你所有的各种实例,然后使用 PlaceholderField (http://django-cms.readthedocs.org/en/support-3.0.x/how_to/placeholders.html)。您仍然无法通过模板变量 define/reference 占位符,但您可以随后遍历您的实例并依次显示它们的 PlaceholderField。
希望对您有所帮助。
如果可以使用静态占位符,您可以使用 add 内置模板过滤器来构建字符串,然后将其传递给占位符标记。
例如:
{% static_placeholder title|add:"-placeholder" %}
有一个解决方法:
{% with child.title as name %}{% static_placeholder name %}{% endwith %}
我用它来将可自定义的链接添加到导航栏菜单中。 结果出奇的稳定。
现在我已经为我们的设计师创建了一个私人页面来自定义菜单。
在页面上获取从 {% show_menu %}
生成的列表,一个包含实际的导航栏模板和一个包含预定义占位符的列表。
遗憾的是,这些占位符必须预定义,因为模板中的占位符不会在结构板中呈现