2011-06-15 55 views
1

我有這樣的模型和的ModelForm:爲什麼我的自定義驗證不被調用?

class Comment(models.Model): 
    text = models.CharField(max_length=100) 

    def clean_text(self): 
    print "called Comment" 
    if len(self.text) <= 5: 
     raise ValidationError("must have 5 chars at least") 

class CommentForm(ModelForm): 
    class Meta: 
    model = Comment 

    def clean_text(self): 
    print "called CommentForm" 
    if len(self.text) <= 5: 
     raise ValidationError("must have 5 chars at least") 

而且我在視圖中使用它們像這樣:

CommentFormSet = modelformset_factory(model=Comment,form=CommentForm,extra=3) 
    if request.method == "POST": 
    formset = CommentFormSet(request.POST) 
    if formset.is_valid(): 
     print "VALID FORM" 
    else: 
    formset = CommentFormSet() 
    return render_to_response("first.html",{"formset":formset},context_instance=RequestContext(request)) 

這是我的模板:

<form action="first" method="post"> 
    {% csrf_token %} 
    {% for dict in formset.errors %} 
     {% for error in dict.values %} 
      {{ error }} 
     {% endfor %} 
    {% endfor %} 
    <table> 
    {{ formset }} 
    </table> 
    <input type="submit" value="Create"/> 
</form> 

事情是,我的驗證永遠不會被調用。我有3個評論,我可以一次添加,如果他們的文本字段爲空,django說這沒有問題。我不正確的是什麼?

編輯:與驗證的變體:

def validate_min(val): 
    print "validator called" 
    if len(val) <= 5: 
    raise ValidationError("At least 5 characters should be provided") 

class Comment(models.Model): 
    text = models.CharField(max_length=100,validators=[validate_min]) 

我的驗證程序不會被調用。

+0

這很奇怪。你確定你沒有做任何重複的類名嗎? – jargalan 2011-06-15 11:47:23

+0

我沒有。我注意到,如果文本長度不是0,則會調用驗證程序。 – Geo 2011-06-15 11:50:17

+0

啊然後也許bcoz django模型字段有空白屬性,默認爲False。這意味着該字段是必需的。所以字段父驗證首先工作。它在通過基本字段驗證後執行自定義驗證 – jargalan 2011-06-15 11:57:08

回答

3

據我所知,模型不使用clean_%方法。你應該使用validator

def validate_min_length(value): 
    if len(value) <= 5: 
     raise ValidationError("must have 5 chars at least") 

class Comment(models.Model): 
    text = models.CharField(max_length=100, validators=[validate_min_length]) 

編輯:答案很簡單:在各領域的任何數據表單集的形式被忽略。這就是爲什麼formset是有效的。空格式are createdempty_permitted=True。這意味着他們will pass validation。覆蓋其中任何一個,你會得到你想要的。

+0

我更新了問題。驗證程序未被調用。 – Geo 2011-06-15 11:31:39

+0

@Geo並輸出「VALID FORM」? – DrTyrsa 2011-06-15 11:37:28

+0

是的。每次我做一個帖子,即使我把這些字段留空。 – Geo 2011-06-15 11:43:31

相關問題