Как заставить ModelForm избегать валидации формы для экземпляров, поступающих для обновления?

models.py

class Receivables(models.Model):
    patient=models.ForeignKey(Patient, on_delete=CASCADE)
    pattern = RegexValidator(r'(RT|rt|rT|Rt)\/[0-9]{4}\/[0-9]{2}\/[0-9]{4}', 'Enter RT Number properly!')
    rt_number=models.CharField(max_length=15, validators=[pattern])
    discount=models.DecimalField(max_digits=9, decimal_places=2, default=0)
    approved_package=models.DecimalField(max_digits=10, decimal_places=2, default=0)
    approval_date=models.DateField(default=None)
    proposed_fractions=models.IntegerField()
    done_fractions=models.IntegerField()
    base_value=models.DecimalField(max_digits=10, decimal_places=2, blank=True)
    expected_value=models.DecimalField(max_digits=10, decimal_places=2, blank=True)

forms.py

class ReceivablesForm(ModelForm):
    class Meta:
        model=Receivables
        fields='__all__'
        widgets={
            "base_value":forms.NumberInput(attrs={"disabled":"on"}),
            "expected_value":forms.NumberInput(attrs={"disabled":"on"}),
            'approval_date': DateInput(attrs={'type': 'date'}),
        }

    def clean(self):
        cleaned_data=super().clean()
        pt=self.cleaned_data['patient']
        print('clean - receivables - instance: ', self.instance)
        if self.instance == None:
            if Discharge.objects.filter(patient=pt):
                dis1=Discharge.objects.filter(patient=pt)
                print('receivable form - dis1 value: ', dis1)
                try:
                    pkg1=Package.objects.filter(patient=pt)
                    dis2=dis1.order_by('-id').first()
                    pkg2=pkg1.filter(date_of_admission__gt=dis2.date_of_discharge)
                    if not pkg2:
                        raise ValidationError('There is no Package value for this entry - 1!')
                except Package.DoesNotExist:
                    raise ValidationError('No history of Package instance!')
            else:
                try:
                    Package.objects.get(patient=pt)
                    print(Package.objects.get(patient=pt))
                except Package.DoesNotExist:
                    raise ValidationError('There is no Package value for this entry - 2!')

При этом проверяется, сохранены ли уже данные в модели, предшествующей этой модели, или нет. Если данные не сохранены, то выдается ошибка валидации, предлагающая пользователю сначала заполнить предыдущую форму.

views.py

def receivables_view(request):
    if request.method=='POST':
        fm_receivables=ReceivablesForm(request.POST)
        if fm_receivables.is_valid():
            receivables=fm_receivables.save()
            ipd=IpdReport.objects.create(patient=receivables.patient, package=Package.objects.filter(patient=receivables.patient).order_by('-id').first(), receivables=receivables)
            OngoingReport.objects.create(ipdreport=ipd)
            fm_receivables=ReceivablesForm()
        return render(request, 'account/receivables.html', {'form6':fm_receivables})
    else:
        fm_receivables=ReceivablesForm()
        return render(request, 'account/receivables.html', {'form6':fm_receivables})

Представление обновления дебиторской задолженности

def update_receivables_view(request, id):
    if request.method=='POST':
        print(request.POST)
        rec=Receivables.objects.get(pk=id)
        print(rec)
        form=ReceivablesForm(request.POST, instance=rec)
        print(form)
        if form.is_valid():
            form.save()
    else:
        rec=Receivables.objects.get(pk=id)
        form=ReceivablesForm(instance=rec)
    return render(request, 'account/update_receivables.html', {'form':form})

Я хочу, чтобы при вводе новых данных он проходил через метод clean и проверял данные. Но если данные поступают из update_receivables_view, он пропускает эту проверку и напрямую сохраняет данные.

Как вы, наверное, поняли, увидев мои коды, я новичок и пытаюсь добиться этого. Сначала я думал, что данные обновления приходят с instance, поэтому я поставил условие, что если instance будет None, то пройдет валидацию ниже. Но при этом он пропускает проверку для обоих сценариев, т.е. при обновлении (чего я и хотел) и при создании нового instance. Поэтому цель размещения валидации для новых экземпляров здесь не удается.

Что я могу сделать?

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