def is_positive_decimal(value): '''Разрешены десятичные числа, с 2 знаками после запятой/точки ''' strng = str(value.replace(',', '.')).split('.') if all(str(i).isdigit() for i in strng): if len(strng) > 2: raise ValidationError(u'много точек/запятых') elif len(strng) == 2 and len(strng[1]) != 2: raise ValidationError( u'Количество чисел после запятой должно быть равно 2') elif len(strng) == 2 and int(strng[0]) == int(strng[1]) == 0: raise ValidationError(u'Введите2 положительное число!') else: raise ValidationError(u'Введите3 положительное число!') class Person(models.Model): name = models.CharField(max_length=50, verbose_name=u'Человек') balance = models.CharField( max_length=50, verbose_name=u'Сумма', validators=[is_positive_decimal]) def __unicode__(self): return self.name
если через админку попробуем сохранить объект класса Theft с money='0-9', но т.к. он у нас не пройдет валидацию is_positive_decimal, нам соответствующим образом укажут на ошибку.
class Theft(models.Model): name = select2.fields.ForeignKey( Person, verbose_name='Человек', ajax=True, search_field='name', overlay=u"выбираем человека", js_options={'quiet_millis': 100,},) money = models.CharField( max_length=50, verbose_name=u'Сумма', validators=[is_positive_decimal]) def save(self, *args, **kwargs): self.money = self.money.replace('.', ',') if len(str(self.money).split(',')) == 1: self.money += ',00' super(Theft, self).save(*args, **kwargs)
если мы модифицируем код следующим образом:
class Theft(models.Model): name = select2.fields.ForeignKey( Person, verbose_name='Человек', ajax=True, search_field='name', overlay=u"выбираем человека", js_options={'quiet_millis': 100,},) money = models.CharField( max_length=50, verbose_name=u'Сумма', validators=[is_positive_decimal]) def save(self, *args, **kwargs): self.money = self.money.replace('.', ',') if len(str(self.money).split(',')) == 1: self.money += ',00' super(Theft, self).save(*args, **kwargs) def clean(self): if float(self.name.balance.replace(',', '.')) < \ float(self.money(',', '.')): raise ValidationError( u'Остаток на счете меньше указанной суммы')
… и попробуем сохраниться теперь объект с money='0-9', то Джанго уже не будет объяснять нам по-хорошему, а вывалится со следующей ошибкой
Exception Value:
invalid literal for float(): 0-9
как поправить ситуацию?