如何运行保存在模型实例中的 Django 代码?
Posted
技术标签:
【中文标题】如何运行保存在模型实例中的 Django 代码?【英文标题】:How to run Django code saved inside Model instances? 【发布时间】:2014-01-27 01:08:15 【问题描述】:我正在使用自定义 Django (v1.5.5) 模型 Widget
用于包含 html 代码(使用 TextField
)放置在不同页面的某些位置,并允许员工用户通过Django 后台管理。
这种方法与 HTML、CSS 和 javascript 代码完美配合。在模板中使用以下语法:
widget.content|safe
但是,我还希望能够将 Django 代码(使用模板标签、调用方法...)放入其中,但是这个 Django 代码不会被执行,而是直接打印出来,就好像它是纯文本一样。
有没有办法使用safe
过滤器来执行 Django 代码?还是我错过了另一个过滤器?也许我必须使用自定义过滤器或模板标签...有什么想法吗?
谢谢!
【问题讨论】:
【参考方案1】:根据@sk1p 的回答,我创建了一个 Django simple_tag
,它接受一个 HTML 字符串(可以包含“Django 代码”)和 context
(这里绝对必要)。然后我只是渲染它并返回。就是这样!
我创建了一个名为 smart_html.py
的文件,其中包含:
from django import template
from django.template import Template
register = template.Library()
@register.simple_tag(takes_context=True)
def render_html(context, html):
return Template(html).render(context)
然后,从模板中我只需要做:
% load smart_html %
% render_html widget.content %
【讨论】:
【参考方案2】:默认情况下,Django 没有这样的模板标签/过滤器。我在我的一个项目中使用它:
class IncludeString(ttag.Tag):
template_src = ttag.Arg()
def render(self, context):
data = self.resolve(context)
try:
t = loader.get_template_from_string(data['template_src'])
except Exception, e:
return u"error rendering template: %s" % unicode(e)
return t.render(context)
class Meta:
name = "include_string"
register.tag(IncludeString)
并像% include_string variable_name_with_template_content %
一样使用它。此实现使用django-ttag,但我认为类似以下的内容也应该有效(未经测试):
@register.simple_tag(takes_context=True)
def include_string(context, template_src):
try:
t = loader.get_template_from_string(template_src)
return t.render(context)
except Exception, e:
return u"error rendering template: %s" % unicode(e)
【讨论】:
非常感谢您的回答 sk1p!根据您的解释,我已经能够找到一个真正的 KISS 解决方案。 +1 :)以上是关于如何运行保存在模型实例中的 Django 代码?的主要内容,如果未能解决你的问题,请参考以下文章
Django 1.11 如何从保存在 CMS 站点模型中的 HTML 中显示模板变量