如何在自定义Django标签上使用安全过滤器?

djmepvbi  于 2023-02-20  发布在  Go
关注(0)|答案(1)|浏览(111)

我正在尝试实现一个自定义Django标记,它将在Javascript中制定一个import语句,以使用axios中的get请求加载我的vue3应用程序及其组件模板html文件。
templatetags目录中的自定义标记如下所示:
templatetags/vuecomponents.py

from django import template
from django.templatetags.static import static

register = template.Library()

@register.simple_tag
def v_load_app_component(app_name, script_name, components):

    components = components.strip("[]").split(", ")

    app_script = static(f"js/{script_name}.js")
    comps = [static(f"components/{name}.html") for name in components]

    return f"import {{{ app_name }}} from \"{app_script}?{components[0]}={comps[0]}\""

现在它只加载第一个组件,因为我只需要一个原型。唯一的问题是当我把它放到一个模板中时,如下所示:
createpost.html

<script type="module">

        {% v_load_app_component "creator" "internalpostform" "[internalpostform]" %}
        // OUTPUTS:
        // import { creator } from &quot;static/js/internalpostform.js?internalpostform=internalpostform.html&quot;

        creator.mount("#app")

</script>

它将相关的import语句输出为:import { creator } from &quot;static/js/internalpostform.js?internalpostform=internalpostform.html&quot;
即使当我尝试应用safe过滤器({% v_load_app_component "creator" "internalpostform" "[internalpostform]"|safe %})时,它仍然逃脱了我的自定义标记函数的输出。
我怎样才能使我的自定义标记的输出不会自动将符号转换为html实体呢?

ie3xauqp

ie3xauqp1#

我在Django的文档中找到了这个过滤器。safe过滤器只适用于变量,例如{{ variable|safe }},但不适用于标签{% tag "argument"|safe %}
要防止Django转义标记的输出,只需使用{% autoescape off %}

{% autoescape off %}
    {% v_load_app_component "creator" "internalpostform" "[internalpostform]" %}
{% endautoescape %}

这将产生所需的行为。

相关问题