2016-04-14 2 views
0

Я написал специальный валидатор, который поднимет ValidationError, если заданное значение поля отрицательное.Пользовательские валидаторы Django не работают

def validate_positive(value): 
     if value < 0: 
      raise ValidationError(
        _('%(value) is negative number'), 
        params = {'value': value} 
        ) 

я добавил это к моей модели поля с помощью месторождения валидаторов аргумента

class Book(models.Model): 
    user = models.ForeignKey(User,on_delete=models.CASCADE) 
    title = models.CharField(max_length=50) 
    price = models.IntegerField(default=0,validators=[validate_positive]) 
    quantity = models.IntegerField(default=0,validators=[validate_positive]) 

Но при создании объекта он не поднимая какую-либо ошибку, если цена меньше нуля.
Я не знаю, где я делаю неправильно, и я новичок в django.
Я использую Django 1.9.
Пожалуйста, помогите мне.

+0

Валидаторы используются для форм, а не для создания объекта. Если вы создаете объект за пределами формы, вам необходимо предоставить альтернативный способ проверки ввода. – Sayse

+0

@Sayse тогда, как проверить ввод, который задан для полей модели? – rock

ответ

5

Валидаторы используются для форм, а не для создания объекта. Если вы создаете объект за пределами формы, вам необходимо предоставить альтернативный способ проверки ввода.

Самый простой способ сделать это состоит в вызове full_clean метода, модели перед сохранением, как показано на docs

from django.core.exceptions import ValidationError 
try: 
    article.full_clean() 
except ValidationError as e: 
    # Do something based on the errors contained in e.message_dict. 
    # Display them to a user, or handle them programmatically. 
    pass 

Это похоже на то, что будет происходить из формы, и будет вызывать любые валидаторы на вашей модели поля.

+0

, поэтому мне нужно переопределить метод save() для проверки модели. – rock

+0

@rock - Нет, на самом деле, потому что это заставит вас проверять дважды каждый раз, когда вы используете (модель) форму. Вам просто нужно убедиться, что вы выполняете проверку перед сохранением. сделайте 'save_and_validate' метод, если вы действительно хотите – Sayse

+1

Спасибо за решение. – rock

Смежные вопросы