Django - Подсчет каждого взноса в баланс каждый месяц

Я сделал программу для контроля счетов и ежемесячных платежей. Я не знаю, является ли способ, которым я сделал свою модель, неправильным, но я добился того, что месяц, в котором мы сейчас находимся, + месяцы для оплаты.

Вот картинка рассрочки на 2 месяца, я хочу появиться в 2 месяцах, но появиться только в последнем (февраль) enter image description here

Теперь я хочу в представлении показать в балансе платежи и их месяцы (т.е.: январь и февраль), но я застрял. Может ли кто-нибудь помочь мне, пожалуйста?

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

Пока работает, всем спасибо!

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