在Django模板渲染前剥离JavaScript代码

2 投票
1 回答
1789 浏览
提问于 2025-04-16 20:06
{% if posts %}
    {% for p in posts %}
        {{p|safe}}
    {% endfor %}
{% endif %}

我想让这个显示HTML,但不想让它运行JavaScript,我该怎么做呢?

1 个回答

4

django 中没有现成的过滤器可以做到你想要的:去掉javascript但保留html。

你可以自己创建一个自定义的模板过滤器来实现这个功能:

from django import template
from django.template.defaultfilters import stringfilter
from django.utils.safestring import mark_safe
from django.utils.encoding import force_unicode
import re

register = template.Library()

@register.filter
@stringfilter
def stripjs(value):
    stripped = re.sub(r'<script(?:\s[^>]*)?(>(?:.(?!/script>))*</script>|/>)', \
                      '', force_unicode(value), flags=re.S)
    return mark_safe(stripped)

(关于模板过滤器和标签放在哪里:自定义模板标签和过滤器/代码布局)

简单说明:

在你的应用文件夹里创建一个名为 templatetags 的文件夹。然后添加一个空文件 __init__.py(这样它就变成了一个包),再创建一个模块文件来放过滤器,命名为 my_filters.py。把代码复制到这个文件里。

在模板文件中添加(在第一次使用过滤器之前): {% load my_filters %}

使用方法:

{% if posts %}
    {% for p in posts %}
        {{ p|stripjs }}
    {% endfor %}
{% endif %}

撰写回答