2014-06-22 116 views
0

我在我的Django Admin站点中使用TinyMCE。我需要验证没有禁止的HTML标签被提交。这是我的尝试:Django-TinyMCE验证规则

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的结果。

任何人都可以帮忙吗?

回答

1

我读的doc和有matchsearch

比赛之间的细微差别:

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

搜索:

扫描通过串寻找第一位置...

search() vs. match()

,因为你需要用你正在寻找的可能是无处不在您的字符串是什么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 
+0

用它来做那个'content = tinymce_models.HTMLField(validators = [CheckForInvalidHtmlTags()])' – MoiTux

+0

该解决方案使用一个仿函数,但是一个简单的函数也没关系 – MoiTux

+0

好极了。问题是使用匹配而不是搜索。谢谢 – Herm

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]) 
+0

谢谢杰米。我试过这个,它似乎不工作。这会导致任何提交失败验证。例如:如果我尝试测试,则失败。

测试

也失败,测试也是如此。从这三个例子中,我预计只有第一个例子会失败,因为不允许使用HTML标记 – Herm

+0

验证器需要的是一个可调用对象,所以它既可以是简单函数也可以是函子:函子是一个对象,它重新定义\ _ \ _ call__方法。我认为在这种情况下,函子可能会更好,因为正则表达式应该编译一次。 – MoiTux

+0

MoiTux,你是对的,但编译正则表达式对性能的影响可以忽略不计,尤其是对于这个用例。验证器还有其他一些方便开发者的功能,包括__init__和__eq__。在这种情况下重写这些是不合理的。 –