如何运行保存在模型实例中的 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 中显示模板变量

如何在保存实例之前获取 django 模型实例的 pk

如何在 django 中处理未保存的多对多关系?

如何将数据库中的 Django 模型实例“腌制”到可用于加载示例数据的示例 python 代码中?

Django - 自定义模型保存方法不显示属性值

django 在父子模型类之间保存实例