0

我在我的 Django 管理站点中使用 TinyMCE。我需要验证没有提交不允许的 HTML 标签。这是我尝试过的:

1) 验证方法

    def check_for_invalid_html_tags(value) :
        compiled_regex = re.compile('<(?!/?(p|div|ul|li)(>|\s))[^<]+?>')

        if compiled_regex.match(value):
            raise ValidationError('Invalid Tags')

2) 验证规则

    content = tinymce_models.HTMLField(validators=[check_for_invalid_html_tags])

这似乎不起作用,因为任何提交都被视为有效。当我将 tinymce_models.HTMLField 更改为 models.TextField 时,该规则完美运行。因此,我认为这个问题是 TinyMCE 的结果。

有人可以帮忙吗?

4

2 回答 2

1

你的验证方法实际上必须是一个验证器,它有像 __call__ 这样的特殊方法。使用 django 的核心验证器之一,例如正则表达式验证器。

from django.core.validators import RegexValidator

check_for_invalid_html_tags = RegexValidator(
        regex=''<(?!/?(p|div|ul|li)(>|\s))[^<]+?>'',
        message='Invalid Tags',
        code='invalid_content'
    )

然后在你的模型中:

content = tinymce_models.HTMLField(validators=[check_for_invalid_html_tags])
于 2014-06-24T18:32:46.683 回答
1

match我阅读了文档,两者之间存在细微差别search

匹配:

如果字符串开头有零个或多个字符...

搜索:

扫描字符串寻找第一个位置...

搜索()与匹配()

因为您要查找的内容可能在您需要使用的字符串中的任何地方search而不是match. 另一点,您可能需要设置 fag re.S 或 re.DOTALL,因为您的输入中可能有换行符。

制作“。” 特殊字符完全匹配任何字符,包括换行符;没有这个标志,'.' 将匹配除换行符以外的任何内容。

所以这里是函子中的 check_for_invalid_html_tags 和一个有效的解决方案。

import re

class CheckForInvalidHtmlTags(object):
    compiled_regex = re.compile('<(?!/?(p|div|ul|li)(>|\s))[^<]+?>')

    def __call__(self, value):
        if self.compiled_regex.search(value):
            print 'error'
        else:
            print 'ok'

c = CheckForInvalidHtmlTags()
c('test test <a>test<a> test') # print error
c('test <p> test</p>') # print ok
c('test<a> test</a><p>test</p>test') # print error
于 2014-06-25T20:49:12.300 回答