【问题标题】:How to run Django code saved inside Model instances?如何运行保存在模型实例中的 Django 代码?
【发布时间】:2014-01-27 01:08:15
【问题描述】:

我正在使用自定义 Django (v1.5.5) 模型 Widget 用于包含 HTML 代码(使用 TextField)放置在不同页面的某些位置,并允许员工用户通过Django 后台管理。

这种方法与 HTML、CSS 和 Javascript 代码完美配合。在模板中使用以下语法:

{{ widget.content|safe }}

但是,我还希望能够将 Django 代码(使用模板标签、调用方法...)放入其中,但是这个 Django 代码不会被执行,而是直接打印出来,就好像它是纯文本一样。

有没有办法使用safe 过滤器来执行 Django 代码?还是我错过了另一个过滤器?也许我必须使用自定义过滤器或模板标签...有什么想法吗?

谢谢!

【问题讨论】:

    标签: django django-templates django-template-filters


    【解决方案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 :)
      猜你喜欢
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 2022-01-24
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多