2014-06-22 115 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__。在這種情況下重寫這些是不合理的。 –