如何向Django-CMS的static_placeholder加载数据?(Python3.6/Django-CMS3.5)
解决Django-CMS 3.5中Static Placeholder无法使用模板标签及复杂HTML的问题
我太懂你这种卡住的感觉了——想用static_placeholder放Bootstrap4的响应式页脚,结果默认插件要么不让用{% static %},要么没法满足复杂布局需求。其实你没遗漏什么关键,只是默认插件的限制而已,下面给你两个实用的解决方案:
方案一:自定义支持模板标签解析的Static HTML插件
这是最灵活的方法,能让你在static_placeholder里自由使用Django模板标签和复杂HTML结构,完美适配Bootstrap4的响应式布局。
步骤1:创建自定义插件模型和逻辑
在你的Django应用里新建/修改以下文件:
cms_plugins.py
from django.template import Template, Context from cms.plugin_base import CMSPluginBase from cms.plugin_pool import plugin_pool from .models import StaticHTMLPluginModel class StaticHTMLPlugin(CMSPluginBase): model = StaticHTMLPluginModel name = "支持模板标签的静态HTML" render_template = "plugins/static_html.html" allow_children = False text_enabled = True def render(self, context, instance, placeholder): context = super().render(context, instance, placeholder) # 解析输入的HTML内容中的模板标签 template = Template(instance.html_content) rendered_content = template.render(Context(context.flatten())) context['rendered_content'] = rendered_content return context plugin_pool.register_plugin(StaticHTMLPlugin)
models.py
from django.db import models from cms.models.pluginmodel import CMSPlugin class StaticHTMLPluginModel(CMSPlugin): html_content = models.TextField("带模板标签的HTML内容") def __str__(self): return "静态HTML插件"
模板文件 templates/plugins/static_html.html
{{ rendered_content|safe }}
步骤2:在Static Placeholder中使用这个插件
- 登录Django-CMS后台,找到Static Placeholders(通常在Settings菜单下)
- 编辑名为
footer的static placeholder,添加刚才创建的「支持模板标签的静态HTML」插件 - 在插件的内容框里直接写Bootstrap4的页脚代码,放心用
{% static %}标签:
<footer class="bg-dark text-white py-4"> <div class="container"> <div class="row"> <div class="col-md-4 mb-3 mb-md-0"> <h5>关于我们</h5> <img src="{% static 'images/footer-logo.png' %}" alt="Logo" class="img-fluid mb-2" style="max-width:150px;"> <p class="small">专注于提供优质的Web解决方案</p> </div> <div class="col-md-4 mb-3 mb-md-0"> <h5>快速链接</h5> <ul class="list-unstyled"> <li><a href="/" class="text-white text-decoration-none">首页</a></li> <li><a href="/about" class="text-white text-decoration-none">关于我们</a></li> <li><a href="/contact" class="text-white text-decoration-none">联系我们</a></li> </ul> </div> <div class="col-md-4"> <h5>联系我们</h5> <p class="small">邮箱:contact@example.com</p> <p class="small">电话:123-456-7890</p> </div> </div> <div class="border-top mt-3 pt-3 text-center small"> © 2024 我的网站 版权所有 </div> </div> </footer>
保存后,前端就能正常渲染带静态资源的响应式页脚了。
方案二:用模板片段替代Static Placeholder(快速应急)
如果你不想写自定义插件,也可以把页脚的HTML直接放在一个单独的模板文件里,比如templates/includes/footer.html,然后在你的基础模板里直接用{% include 'includes/footer.html' %}代替{% static_placeholder "footer" %}。
这种方法的缺点是没法在后台编辑页脚内容,但胜在快速简单——如果你的页脚内容不需要经常修改,这个方案很合适。
注意事项
- 自定义插件里用了
|safe过滤器,确保HTML内容不会被转义,记得只在你信任的内容上使用这个过滤器 - 如果你用的是Django的
staticfiles配置,确保{% load static %}已经在你的基础模板里加载了,这样插件里的{% static %}才能正常工作
内容的提问来源于stack exchange,提问作者ekydfejj
相关产品推荐
相关产品推荐

