我有這樣的模型和的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])
我的驗證程序不會被調用。
這很奇怪。你確定你沒有做任何重複的類名嗎? – jargalan 2011-06-15 11:47:23
我沒有。我注意到,如果文本長度不是0,則會調用驗證程序。 – Geo 2011-06-15 11:50:17
啊然後也許bcoz django模型字段有空白屬性,默認爲False。這意味着該字段是必需的。所以字段父驗證首先工作。它在通過基本字段驗證後執行自定義驗證 – jargalan 2011-06-15 11:57:08