Django - Подсчет каждого взноса в баланс каждый месяц
Я сделал программу для контроля счетов и ежемесячных платежей. Я не знаю, является ли способ, которым я сделал свою модель, неправильным, но я добился того, что месяц, в котором мы сейчас находимся, + месяцы для оплаты.
Вот картинка рассрочки на 2 месяца, я хочу появиться в 2 месяцах, но появиться только в последнем (февраль)

Теперь я хочу в представлении показать в балансе платежи и их месяцы (т.е.: январь и февраль), но я застрял. Может ли кто-нибудь помочь мне, пожалуйста?
Model.py
class Balance(models.Model):
account = models.ForeignKey(Account, null=True, on_delete=models.SET_NULL)
value = models.FloatField(null=True)
installment = models.IntegerField(null=True, default=0) #How many installments
installment_value = models.FloatField(null=True, default=0) #Value of it
months = models.IntegerField(null=True, default=0) #From a range (1, 12) calculates the last month
def save(self, *args, **kwargs):
self.months = (int(datetime.now().strftime("%m")) + int(self.installment))-1
if self.months > 12:
self.months = int(self.months) - 12
super().save(*args, **kwargs)
View.py
#BALANCE
def balance(request, pk):
name = Client.objects.all().get(user=request.user)
account = Account.objects.all().get(id=pk)
balance = account.balance_set.all()
ctx = {'account': account, 'name': name, 'balance': balance,
'months': {'Jan': 1, 'Feb': 2, 'Mar': 3,
'Apr': 4, 'May': 5, 'Jun': 6, 'Jul': 7,
'Aug': 8, 'Sep': 9, 'Oct': 10,
'Nov': 11, 'Dec': 12}} #Months dict is for view, it goes in a for loop to appear in the same page
return render(request, 'balance.html', ctx)
Форма
def pay(request, pk):
name = Client.objects.all().get(user=request.user)
account = Account.objects.all().get(id=pk)
balance = account.balance_set.all()
if request.method == "POST":
form_install = Installment(request.POST)
form_balance = Balance(request.POST)
if form_install.is_valid() and form_balance.is_valid():
bal = form_balance
total_value = ext['value'].value()
Account.objects.filter(id=pk).update(credit=F('credit') - total_value)
bal.save()
return redirect(f'/credito/{pk}')
Шаблон
<div class="card card-body">
{% for key, value in months.items %}
<table class="table">
<tr>
<th>Value</th>
<th>Installments</th>
<th>Installments Value</th>
</tr>
<h4>{{key|upper}}</h4>
<tr>
{% for bal in balance %}
{% if value == bal.months %}
<td>${{bal.value}}</td>
<td>{{bal.installment}}x</td>
<td>${{bal.installment_value}}</td>
</tr>
{% endif %}
{% endfor %}
{% endfor %}
</table>
</div>
Спасибо!
Я хочу поблагодарить @Henty за помощь!
Как и моя проблема, я решил ее с помощью списка, поиск for будет выполняться с наибольшим числом в списке параллельно.
Итак, у нас есть взнос через 8 месяцев и еще один через 2 месяца. Я создаю список
list = [] #This list receives the number (i.e: 2 and 8)
for i in balance:
for j in range(i.months): #This for will run through the range
j += 1 #Just to make the index 1
list.append(j) #APPEND [1, 2, 1, 2, 3, 4, 5, 6, 7, 8]
final_list = list(dict.fromkeys(list))
print(final_list) # OUTPUT: [1, 2, 3, 4, 5, 6, 7, 8]
А в шаблоне:
{% for l in list %} #RUN THE LIST
{% for bal in balance %} #RUN THE MODEL
{% if l == value and bal.months >= l %} #THIS MAKES IT APPEARS IN EVERY MONTH FROM 1 TO FINAL MONTH
Пока работает, всем спасибо!