在django模板中渲染返回的字符串

时间:2018-04-28 10:16:25

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

我最近一直在使用Django的模板语言,并且在大多数情况下它运行良好,但最近我遇到了一个它无法解决的小问题。
我在迭代一堆数据库对象,并在每个数据库模板中构建一个按钮。像这样:

{% for item in items %}
    <button id="{{ item.action.id }}">
        {{ item.action.text }}
    </button>
{% endfor %}

这很好用,但我的Action类是可继承的,并且可能有不同的按钮结构。说我想有时也附加一个javascript函数。我的第一个是嗯,让我们在我的班级中创建一个渲染方法,然后在我的模板中调用它。

class ScriptAction(Action):

    def render(self):
        return '''
            <button id="{}" onclick={}>
                {}
            </button>'''.format(self.id, self.func, self.text)

因为没有模板更优雅,并且不依赖于固定的按钮结构:

{% for item in items %}
    {{ item.action.render|safe }}
{% endfor %}

现在我的实际问题是:如果这个呈现的字符串需要django进一步处理怎么办?
也许render方法返回一个像

这样的字符串
<button id="action-button-id" onclick="console.log('clicked')">
    {{ item.name }}
</button>

目前,{{ item.name }}不会在模板循环中呈现。有办法解决这个问题吗?

也许我让它变得比它应该更复杂,但我已经查看了Django内置标签和过滤器,甚至看了writing you own parser。但在这一点上,我内心的某些东西告诉我,我正在迷恋。这实际上只是一个小问题,需要相当长的时间,所以 -

  • 这是值得付出的努力吗?
  • 正在编写像这样安全的复杂解析器吗?
  • 是Django模板语言,甚至可以做这样的事情吗?

如果你可以磨练其中的一些观点,我会非常感激。这个问题真让我烦恼 提前谢谢!

1 个答案:

答案 0 :(得分:0)

我会查看用于构建自定义模板标记的simple_tag选项,并使用标记:

  1. 将模型实例作为其参数(加上下文!)
  2. 向模型实例询问用于渲染的模板代码片段
  3. 使用the raw template API呈现该模板代码段
  4. 返回结果,如果您知道它是安全的,可选择标记为安全。