Как я могу получить предыдущий экземпляр объекта в шаблонах Django динамически?
У меня есть **model**
, которая аккумулирует большинство других моделей для отображения отчета.
class IpdReport(models.Model):
patient=models.ForeignKey(Patient, on_delete=CASCADE)
package=models.ForeignKey(Package, on_delete=CASCADE, blank=True, null=True)
receivables=models.ForeignKey(Receivables, on_delete=CASCADE, blank=True, null=True)
discharge=models.ForeignKey(Discharge, on_delete=CASCADE, blank=True, null=True)
realization=models.ForeignKey(Realization, on_delete=CASCADE, blank=True, null=True)
lockdata=models.ForeignKey(LockData, on_delete=CASCADE, blank=True, null=True)
Как вы видите, большинство из fields
являются необязательными.
filters.py
class IpdFilters(django_filters.FilterSet):
patient__name=django_filters.CharFilter(lookup_expr='icontains', label='Name')
package__patient_type__patient_type=django_filters.CharFilter(lookup_expr='icontains', label='Type of Patient')
realization__amount_received__gt=django_filters.NumberFilter(field_name='realization__amount_received', lookup_expr='gt', label='Min. Amount Received')
realization__amount_received__lt=django_filters.NumberFilter(field_name='realization__amount_received', lookup_expr='lt', label='Max. Amount Received')
from_date=django_filters.DateFilter(widget=forms.DateInput(attrs={'id': 'from'}), field_name='package__date_of_admission', label='From - Date of Admission ', lookup_expr='gte')
to_date=django_filters.DateFilter(widget=forms.DateInput(attrs={'id': 'to'}), field_name='package__date_of_admission', label='To - Date of Admission ', lookup_expr='lte')
class Meta:
model=IpdReport
fields={
'realization__cash':['exact']
}
Я хочу, чтобы, когда context
передает экземпляр в template
, template
мог получить доступ к предыдущему экземпляру, содержащему тот же patient
, чтобы я мог использовать его для отображения определенного текста в одном из table-data
на основе условия, которое я поставил.
Я пробовал что-то вроде:
views.py
def ipd_report_view(request):
report=IpdReport.objects.all().order_by('id')
myFilter=IpdFilters(request.POST, queryset=report)
report=myFilter.qs
lst=[]
temp_lst=[]
for indie in report:
prev=IpdReport.objects.filter(patient=indie.patient).order_by('id')
print('prev ka value: ', prev)
for chu in prev:
if chu not in lst:
lst.append(chu)
ln=len(lst)
for i in range(0, ln):
if i not in temp_lst:
temp_lst.append(i)
pitch=prev[:ln-1]
total1=report.aggregate(Sum('realization__amount_received'))
total2=report.aggregate(Sum('realization__deficit_or_surplus_amount'))
context={'report': report, 'total1':total1, 'total2':total2, 'myFilter':myFilter, 'previous':lst, 'len':temp_lst, 'siz':ln}
return render(request, 'account/ipdreport.html', context)
А **template**
- это что-то вроде:
{% for rp in report %}
{% elif rp.realization %}
{% for ln in len|slice:"1:siz" %}
{% for prev in previous|slice:":ln|sub:1" %}
{% with previd=prev.id|sub:1 %}
{% if previd %}
{% if prev.realization %}
{% if prev.realization.cash == False %}
{% if prev.realization.deficit_or_surplus_amount < 0 %}
Repudiated/
{% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endwith %}
{% endfor %}
{% endfor %}
{% endif %}
{% endfor %}
Я знаю, что это просто беспорядок. Как новичок, я пытался сделать это всеми возможными способами, но безрезультатно.
Я хочу донести до него, что когда в текущем экземпляре есть realization
и если у него есть предыдущий экземпляр с тем же patient
и если предыдущий тоже имеет данные realization
и его realization.cash
равен False
, ТО, если текущий realization.deficit_or_surplus_amount
имеет отрицательное значение, то вывести нужный текст в соответствующем td.
Есть ли другой способ достичь этого или мне нужно внести некоторые изменения в текущую логику? Пожалуйста, помогите.