ValidationError at /opd/ [''Значение объекта OPDCashSheet (2)'' должно быть десятичным числом.'] Как модель-объект может быть десятичным числом?

models.py:

class Opd(models.Model):
    patient=models.ForeignKey(Patient, on_delete=CASCADE)
    bill_number=models.IntegerField(default=None)
    date=models.DateField(default=datetime.date.today)
    service_name=models.ForeignKey(ServiceName, on_delete=SET_NULL, null=True)
    mode=models.CharField(max_length=5, default=None)
    amount=models.DecimalField(max_digits=7, decimal_places=2)
    remarks=models.TextField(max_length=500, blank=True, default=None)
    opd_date=models.DateTimeField(auto_now_add=True)
    modified_on=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.patient.name

class OPDParticulars(models.Model):
    opd_particulars=models.CharField(max_length=150)

    def __str__(self):
        return self.opd_particulars

class OPDCashSheet(models.Model):
    date=models.DateField(default=datetime.date.today)
    patient=models.ForeignKey(Patient, on_delete=SET_NULL, blank=True, null=True)
    opd=models.ForeignKey(Opd, on_delete=SET_NULL, null=True, blank=True)
    opd_particulars=models.ForeignKey(OPDParticulars, on_delete=SET_NULL, null=True, blank=True)
    source=models.CharField(max_length=10, default='OPD', null=True, blank=True)
    case_number=models.IntegerField(null=True, blank=True)
    mode=models.CharField(max_length=5)
    cash_in=models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)
    cash_out=models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)
    balance=models.DecimalField(max_digits=7, decimal_places=2, default=0)
    bank_oopl=models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)
    remarks=models.TextField(max_length=500, blank=True, null=True, default=None)
    created_on=models.DateTimeField(auto_now_add=True)
    modified_on=models.DateTimeField(auto_now=True)

class BankDeposits(models.Model):
    opdcashsheet=models.ForeignKey(OPDCashSheet, on_delete=SET_NULL, null=True, blank=True)
    date=models.DateField(default=None)
    amount=models.DecimalField(max_digits=7, decimal_places=2, default=None)
    bank=models.CharField(max_length=70, default=None, null=True, blank=True)
    mode=models.CharField(max_length=5, default=None)
    bank_ac=models.CharField(max_length=25, default='ABC Pvt. 123456789')
    branch=models.CharField(max_length=20, default='XYZ')
    remarks=models.TextField(max_length=500, blank=True, null=True, default=None)
    created_on=models.DateTimeField(auto_now_add=True)
    modified_on=models.DateTimeField(auto_now=True)

forms.py:

class UpdateOPDCashSheetForm(ModelForm):
    MODE_SELECT = (
        ('cash', 'Cash'),
        ('bank', 'Bank'),
    )
    mode=forms.CharField(widget=forms.RadioSelect(choices=MODE_SELECT, attrs={'class': 'form-check-inline'}))
    class Meta:
        model=OPDCashSheet
        labels={
            'cash_in':'Cash-in',
            'cash_out':'Cash-Out',
            'balance':'Cash Balance',
            'bank_oopl':'To Bank',
            'opd_particulars':'Description',
        }
        fields='__all__'
        widgets={
            'date': DateInput(attrs={'type': 'date'}),
        }

class BankDepositsForm(ModelForm):
    MODE_SELECT = (
        ('cash', 'Cash'),
        ('bank', 'Bank'),
    )
    mode=forms.CharField(widget=forms.RadioSelect(choices=MODE_SELECT, attrs={'class': 'form-check-inline'}))
    class Meta:
        model=BankDeposits
        labels={
            'bank_ac':'Bank A/c',
        }
        fields='__all__'
        widgets={
            'date': DateInput(attrs={'type': 'date'}),
        }

class OpdForm(ModelForm):
    MODE_SELECT = (
        ('cash', 'Cash'),
        ('bank', 'Bank'),
    )
    mode=forms.CharField(widget=forms.RadioSelect(choices=MODE_SELECT, attrs={'class': 'form-check-inline'}))
    class Meta:
        model=Opd
        fields='__all__'
        widgets={
            'date': DateInput(attrs={'type': 'date'}),
        }

views.py:

def opd_view(request):
    if request.method=='POST':
        fm_opd=OpdForm(request.POST)
        if fm_opd.is_valid():
            opd=fm_opd.save()
            OpdReport.objects.create(patient=opd.patient, opd=opd)
            if opd.mode=='cash':
                OPDCashSheet.objects.create(date=opd.date, patient=opd.patient, opd=opd, case_number=opd.bill_number, mode=opd.mode, cash_in=opd.amount)
            elif opd.mode=='bank':
                opdcashsheet=OPDCashSheet.objects.create(date=opd.date, patient=opd.patient, opd=opd, case_number=opd.bill_number, mode=opd.mode, bank_oopl=opd.amount)
                BankDeposits.objects.create(opdcashsheet=opdcashsheet.id, date=opd.date, amount=opd.amount, mode=opd.mode, remarks=opd.remarks)
            fm_opd=OpdForm()
        return render(request, 'account/opd.html', {'form1':fm_opd})
    else:
        fm_opd=OpdForm()
        return render(request, 'account/opd.html', {'form1':fm_opd})

Переходя к view, все работало нормально, когда mode был cash и он создал объект для OPDCashSheet, но когда mode был bank, он не может создать объект для той же модели, указывая ValidationError - ['“OPDCashSheet object (2)” value must be a decimal number.']. Теперь, если бы этот объект мог быть создан, он был бы OPDCashSheet object (3), так как второй объект уже сохранен в базе данных. Так где же я ошибаюсь? Как объект модели может быть десятичным полем? Пожалуйста, помогите.

Вернуться на верх