Как написать проверку поля forms.IntegerField чтобы значение не уходило в минус?
Подскажите как написать проверку поля forms.IntegerField чтобы значение не уходило в минус. Суть моей формы, что авторизованный пользователь может выбрать в поле account_1 счет от куда перевести, а в поле account_2 куда перевести средства. Поле amount это сколько перевести. Вот класс формы.
forms.py
class TransfersForm(forms.Form):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(TransfersForm, self).__init__(*args, **kwargs)
self.fields['account_1'].queryset = Bank_Account.objects.filter(client=self.user)
self.fields['account_2'].queryset = Bank_Account.objects.filter(client=self.user)
account_1 = forms.ModelChoiceField(queryset=None, label='С какого счёта')
account_2 = forms.ModelChoiceField(queryset=None, label='На какой счёт')
amount = forms.IntegerField(label='Сумма перевода')
def clean_account_1(self): # это поле с которого нужно сделать перевод
form_amount = self.cleaned_data.get('amount')
form_account_1 = self.cleaned_data.get('account_1') # здесь получаю из формы с какого счета
account_db = Bank_Account.objects.filter(client=self.user, account=form_account_1) # сюда получаю из БД счёт пользователя
if account_db[0].account_balance.balance < 0: # здесь хочу сделать проверку, что если счёт ушел в минус то выдать ошибку
raise ValidationError('Недостаточно средств на счёте')
return form_account_1
Но Джанго ни как не реагирует на эту валидацию и баланс на счете все равно уходит в минус. Подскажите, что я делаю не так.
Вопрос решился так (спасибо незнакомцу из чата Telegram).
В models.py в классе Account_Balance поле balance заменил на models.PositiveIntegerField().
Теперь при попытке перевода средств со счет на счет, если баланс уходит в минус то выдается ошибка IntegrityError и Django`вская страница с трассировкой. Я думаю, что эту ошибку можно перехватывать и выводить, что-то свое, но цель достигнута значение поля не уходит в минус.
Вот код по итогу:
forms.py
class TransfersForm(forms.Form):
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user', None)
super(TransfersForm, self).__init__(*args, **kwargs)
self.fields['account_1'].queryset = Bank_Account.objects.filter(client=self.user)
self.fields['account_2'].queryset = Bank_Account.objects.filter(client=self.user)
account_1 = forms.ModelChoiceField(queryset=None, label='С какого счёта')
account_2 = forms.ModelChoiceField(queryset=None, label='На какой счёт')
amount = forms.IntegerField(label='Сумма перевода', validators=[validators.MinValueValidator(0),])
def clean(self):
if self.cleaned_data['account_1'] == self.cleaned_data['account_2']:
raise ValidationError('Перевод невозможен. Выбраны одинаковые счета')
def clean_amount(self):
form_amount = self.cleaned_data.get('amount')
if form_amount > 1000:
raise ValidationError('Сумма перевода должна быть меньше 1000')
return form_amount
В models.py изменился только класс Account_Balance
models.py
class Account_Balance (models.Model):
bank_account = models.OneToOneField(Bank_Account, on_delete=models.CASCADE)
balance = models.PositiveIntegerField(default=0, verbose_name='Баланс')
def __str__(self):
return self.balance
def get_absolute_url(self):
return reverse('add_balance', kwargs={'account_balance_pk': self.pk})
class Meta:
verbose_name = 'Баланс счёта'
@receiver(post_save, sender=Bank_Account)
def create_user_bank_account(sender, instance, created, **kwargs):
if created:
Account_Balance.objects.create(bank_account=instance)
@receiver(post_save, sender=Bank_Account)
def save_user_bank_account(sender, instance, **kwargs):
instance.account_balance.save()