【发布时间】:2011-09-15 10:59:59
【问题描述】:
我有这个模型和模型形式:
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 个可以一次添加的 cmets,如果他们的文本字段为空,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,则调用验证器。
-
啊,那么可能 bcoz django 模型字段具有空白属性,默认值为 False。这意味着该字段是必需的。所以字段父验证首先起作用。它在通过基本字段验证后执行自定义验证
-
好的,但是为什么会显示“VALID FORM”?
-
或者,如果数据为空白,可能不会调用自定义验证
标签: django django-validation django-forms