Как заставить 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
. Поэтому цель размещения валидации для новых экземпляров здесь не удается.
Что я могу сделать?