Форум сайта python.su
Допустим есть следующий код:
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
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'Остаток на счете меньше указанной суммы')
Офлайн
проблема в том, что clean выполняется раньше, чем проверка заполнены ли поля и проходят ли они валидацию.
вопрос же глупый. но я никак из документации не могу понять где у меня ошибка
Офлайн
Зачем деньги хранить как строку? Сделайте DecimalField, там есть max_digits и decimal_places.
Офлайн
FishHookэто я знаю. но мне надо, чтобы можно было при вводе копейки от рублей отделялять хоть точкой, хоть запятой, а в базу сохранять с запятой.
Зачем деньги хранить как строку? Сделайте DecimalField, там есть max_digits и decimal_places.
Офлайн
andrey16Ну это вообще никак не дело модели какие-то там запятые от точек отделять. Все это делается в формах или в представлениях, но ни как не в модели.
это я знаю. но мне надо, чтобы можно было при вводе копейки от рублей отделялять хоть точкой, хоть запятой, а в базу сохранять с запятой.
Офлайн
сделайте деньги в моделях правильно - как decimal. Т.е. и money и balance. Далее в класс формы пишете метод:
def clean_money(self): money = self.cleaned_data['money'] if self.name.balance < money: raise ValidationError(u'Остаток на счете меньше указанной суммы') return money
Офлайн