【问题标题】:Why is my custom validation not being called?为什么没有调用我的自定义验证?
【发布时间】: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


【解决方案1】:

据我所知,模型不使用 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。覆盖其中任何一个,你都会得到你想要的。

【讨论】:

  • @Geo 和'VALID FORM' 输出了吗?
  • 是的。每次我发帖时,即使我将字段留空。
  • 但是没有数据的表格显然是无效的。
  • @Geo 想象一个带有extra=5 的表单集。您将有 5 个表格。您填写 2。2 个表格被验证,其他 3 个被忽略。这是 Django 的方法。 :-) 如果您想填写所有五张表格,可能您应该检查len(self.forms) 或其他方式。
  • 应该有办法,这样当你调用formset.is_valid()的时候,如果所有的form都通过了就会返回True。
猜你喜欢
  • 2016-10-11
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
相关资源
最近更新 更多