7. Добавьте строку "Количество расходов на категорию" в список категорий

Я работаю в Django ORM, у меня есть два класса и 2 формы. Я хочу, чтобы значения из кверисета из класса ExpenseListView(ListView) отображались в классе CategoryListView(ListView), а затем в форме category_list.html

from django.contrib.admin import filters
from django.db.models import Sum, Count, Max, Q
from django.db.models.functions import ExtractYear, ExtractMonth
from django.views.generic.list import ListView

from . import models
from .forms import ExpenseSearchForm
from .models import Expense, Category
from .reports import summary_per_category


class ExpenseListView(ListView):
    model = Expense
    paginate_by = 20  # how may items per page

    def get_context_data(self, *, object_list=None, **kwargs):
        queryset = object_list if object_list is not None else self.object_list

        form = ExpenseSearchForm(self.request.GET)
        if form.is_valid():
            name = form.cleaned_data.get('name', '').strip()
            fromdate = form.cleaned_data.get('fromdate', '')
            todate = form.cleaned_data.get('todate', '')
            category = form.cleaned_data.get('category', '')
            order_by = form.cleaned_data.get('order_by', '')
            sort_descending = form.cleaned_data.get('sort_descending', '')

            filters = {}

            if name:
                filters['name__icontains'] = name
            if fromdate and todate:
                filters['date__range'] = [fromdate, todate]
            if category:
                filters['category__in'] = category

            queryset = queryset.filter(**filters)

            if order_by:
                if sort_descending:
                    queryset = queryset.order_by(order_by).reverse()
                else:
                    queryset = queryset.order_by(order_by)

            total_amount_spent = queryset.aggregate(Sum('amount'))

            total_summary_per_year_month = queryset.annotate(year=ExtractYear('date'),
                                                             month=ExtractMonth('date')). \
                values('year', 'month').annotate(sum=Sum('amount')).order_by('year', 'month')

        return super().get_context_data(
            form=form,
            object_list=queryset,
            summary_per_category=summary_per_category(queryset),
            total_amount_spent=total_amount_spent,
            total_summary_per_year_month=total_summary_per_year_month,
            **kwargs
        )


class CategoryListView(ListView):
    model = Category
    paginate_by = 5

Как загрузить данные из одного класса в другой и сделать их такими, когда я фильтрую данные: Добавить количество расходов на строку категории в списке категорий.

{% extends "base.html" %}

{% block content %}
<a href="{% url 'expenses:category-create' %}">add</a>

<table border="1">
    <thead>
        <tr>
            <th>name</th>
            <th>actions</th>
            <th>actions</th>
            <th>expenses</th>
        </tr>
    </thead>
    <tbody>
        {% for obj in object_list %}
        <tr>
            <td>
                {{obj.name}}
            </td>
            <td>
                <a href="{% url 'expenses:category-delete' obj.id %}">delete</a>
            </td>
            <td>
                <a href="{% url 'expenses:category-update' obj.id %}">update</a>
            </td>
        </tr>
        {% endfor %}
    </tbody>
</table>
{% endblock %}

Добавьте количество расходов на строку категории в списке категорий.

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