【问题标题】:Render returned string in django template在 django 模板中渲染返回的字符串
【发布时间】:2018-10-09 01:35:12
【问题描述】:

我最近一直在使用 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 模板语言甚至可以做这样的事情吗?

如果您能深入了解其中的一些观点,我将不胜感激。这个问题真的很困扰我。
提前致谢!

【问题讨论】:

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


    【解决方案1】:

    我会研究 simple_tag 选项来构建自定义模板标签,并拥有标签:

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

    【讨论】:

    • 太棒了!这是一个强大的小工具
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-12
    • 2020-08-10
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    相关资源
    最近更新 更多