class Dog(models.Model):
bark_volume = models.DecimalField(...
unladen_speed = models.DecimalField(...
def clean(self):
if self.bark_volume < 5:
if not self._errors.has_key('bark_volume'):
from django.forms.util import ErrorList
self._errors['bark_volume'] = ErrorList()
self._errors['bark_volume'].append('must be louder!')
Это работает с формами, по крайней мере. Никогда не пробовал это на самой модели, но методология должна быть одинаковой. Тем не менее, из документов Django:
Когда вы используете ModelForm, вызов is_valid () будет выполнять эти шаги проверки для всех полей, включенных в форму. (Для получения дополнительной информации см. Документацию по ModelForm.) Вам нужно только вызвать метод full_clean () модели, если вы планируете самостоятельно обрабатывать ошибки проверки или если вы исключили из ModelForm поля, требующие проверки.
И ...
Обратите внимание, что full_clean () не будет вызываться автоматически при вызове метода save () вашей модели и в результате проверки ModelForm. Вам нужно будет вызвать его вручную, если вы хотите запустить проверку модели вне ModelForm.
Так что, по сути, если у вас нет действительно веской причины для очистки поля на модели, вы должны вместо этого сделать это в форме. Код для этого будет выглядеть так:
class DogForm(forms.ModelForm):
def clean(self):
bark_volume = self.cleaned_data.get('bark_volume')
if bark_volume < 5:
if not self._errors.has_key('bark_volume'):
from django.forms.util import ErrorList
self._errors['bark_volume'] = ErrorList()
self._errors['bark_volume'].append('must be louder!')
return self.cleaned_data
И это точно сработает.