【问题标题】:django template filter remove html tagsdjango模板过滤器删除html标签
【发布时间】:2011-09-30 05:10:24
【问题描述】:

在下面的django模板变量中。是否可以通过django模板过滤器删除html标签

 {{myvar|safe}}

下面会输出一个类似

的 html
     <div>sddfdsfsdfsdf sd fsdf sd fsdf </div><a>This link</a><img src="some source" />

【问题讨论】:

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


    【解决方案1】:

    你看过striptags吗?它会将你的 HTML 变成这样(当然,减去 This 的语法突出显示):

    sddfdsfsdfsdf sd fsdf sd fsdf This link
    

    但请注意,此模板过滤器使用regex 来去除 HTML 标记。 As we know,大多数时候,正则表达式不是处理 HTML 的正确工具。如果您的 HTML 来自外部,请确保使用真正的 HTML 解析器对其进行清理,例如lxml.html.clean.

    【讨论】:

    • 它会去掉所有标签,只留下在 DOM 中被认为是 TextNodes 的内容。因此,您的图像将被删除而不会留下任何痕迹。
    • 我建议使用{{ myvar|striptags|safe }} 这样HTML 实体,例如&amp;nbsp;,不会被Django 转义,而是保存在HTML 代码中并由Web 浏览器呈现。请注意,striptags 过滤器实际上会去除 HTML 标记,而不是实体。
    • @Luca 你能参考一下“实体”的含义(而不是 HTML 标签)吗?谢谢。
    • HTML 实体是一系列数字或字符实体,它们对一些不属于标准 ascii 字符集的字符进行编码。这包括从&符号和编码为&amp;amp; 到引号&amp;rdquo; &amp;ldquo;much more 的所有内容
    • 请注意,striptags 不会 保护您免受 HTML 注入:Template('{{ s|striptags }}').render(s='&amp;lt;script src="http://chezsoi.org"/&amp;gt;')
    【解决方案2】:

    带标签

    尽一切可能去除所有 [X]HTML 标签。

    例如:

    {{ myvar|striptags }}
    

    如果 myvar 是 &lt;b&gt;Joel&lt;/b&gt; &lt;button&gt;is&lt;/button&gt; a &lt;span&gt;slug&lt;/span&gt;,则输出将为 Joel is a slug

    您还可以在 python 代码中使用 strip_tags,即在表单中。

    例如,在 Form clean 方法中:

    class AddressForm(forms.ModelForm):
    
        class Meta:
            model = Address
    
        def clean(self):
            from django.utils.html import strip_tags
            cleaned_data = super(AddressForm, self).clean()
            cleaned_data['first_name'] = strip_tags(cleaned_data.get('first_name'))
            return cleaned_data
    

    Django HTML Utils,也看看这个简单的Django HTML Sanitizer App

    【讨论】:

      【解决方案3】:

      要从现有字符串中剥离/删除 HTML 标签,我们可以使用 strip_tags 函数。

      导入 strip_tags

      from django.utils.html import strip_tags
      

      内含html的简单字符串。

      html = '<p>paragraph</p>'
      
      print html # will produce: <p>paragraph</p>
       
      
      stripped = strip_tags(html)
      print stripped # will produce: paragraph
      

      这也可以作为模板标签使用:

      {{ somevalue|striptags }}
      

      如果您只想删除特定标签,则需要使用 removetags

      from django.template.defaultfilters import removetags
      html = '<strong>Bold...</strong><p>paragraph....</p>'
      stripped = removetags(html, 'strong') # removes the strong only.
      stripped2 = removetags(html, 'strong p') # removes the strong AND p tags.
       
      

      也可以在模板中使用:

      {{ value|removetags:"a span"|safe }}
      

      【讨论】:

        猜你喜欢
        • 2011-10-17
        • 2013-03-16
        • 1970-01-01
        • 2020-02-16
        • 2011-08-01
        • 2012-10-11
        • 2018-02-11
        • 2019-01-01
        • 1970-01-01
        相关资源
        最近更新 更多