Почему моя пользовательская проверка не вызывается? - PullRequest
1 голос
/ 15 июня 2011

У меня есть эта модель и модель формы:

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])

Мой валидатор не вызывается.

1 Ответ

3 голосов
/ 15 июня 2011

Как я знаю, модели не используют методы clean_%.Вы должны использовать валидатор .

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 действителен.Пустые формы создаются с empty_permitted=True.Это означает, что они пройдут проверку .Отмените любой из них, и вы получите то, что хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...