Почему мой упорядоченный список с переменной шаблона показывает цифру один для каждой записи?

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

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

Вот как это выглядит:

enter image description here

Вот мой код:

views.py

class ReportView(LoginRequiredMixin, TemplateView):
    template_name = "inventory/reports.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["purchases"] = Purchase.objects.all()
        revenue = Purchase.objects.aggregate(
            revenue=Sum("menu_item__price"))["revenue"]
        total_cost = 0
        for purchase in Purchase.objects.all():
            for recipe_requirement in purchase.menu_item.reciperequirement_set.all():
                total_cost += recipe_requirement.ingredient.unit_price * \
                    recipe_requirement.quantity

        purchases = Purchase.objects.values(
            'timestamp',
            item_name=F('menu_item__name'),
            item_price=F('menu_item__price'),
            item_desc=F('menu_item__description'))
        df = read_frame(purchases)
        grouped_purchases = df.groupby('item_name')[
            'timestamp'].count().reset_index()
        sort_purchases = grouped_purchases.sort_values("timestamp", axis=0,
                                                       ascending=False,
                                                       ignore_index=True)
        top_3 = sort_purchases.nlargest(3, 'timestamp', keep='all')
        list_of_top_3_purchases = top_3['item_name'].to_list()

        context["revenue"] = revenue
        context["total_cost"] = total_cost
        context["profit"] = revenue - total_cost
        context["gross_profit"] = (revenue - total_cost) / total_cost * 100
        context["gross_margin_ratio"] = (revenue - total_cost) / revenue * 100
        context["list_of_purchases"] = list_of_top_3_purchases

        return context

reports.html

...
     <section
            style="color: black;"><h2>Top 3 Purchases</h2>
         {% for item in list_of_purchases %}
            <ol>
                  <li>{{ item }}</li>
            </ol>
         {% endfor %}
     </section>
...

Для перехода на новый уровень я хотел бы знать, как показать связанные элементы с одинаковым номером. Любая помощь, которую вы можете предоставить, будет с благодарностью принята. Спасибо.

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

        <ol>
              <li>PB&J</li>
        </ol>
        <ol>
              <li>Vege Pizza</li>
        </ol>

Однако простое размещение цикла внутри одного тега <ol>...</ol> не поможет вам с повторяющимися числами. Вам нужно будет каким-то образом присвоить число на основе результата. Лучше всего это сделать в представлении.

nb: Ниже приведен псевдокод, поскольку я не очень хорошо знаком с numpy, поэтому он не будет работать, но должен дать вам представление о том, что вам нужно сделать:

предполагает порядок убывания временной метки

current_count = 0
#set intial current_value to first top_item's value
current_value = top_3[0]['timestamp']

#loop thrru top_3
for top_item in top_3:
    # if value of timestamp is changed, increment count and set current_value to timestamp
    if current_value < top_item['timestamp']:
         current_count += 1             
         top_item['count'] = current_count
         current_value = top_item['timestamp']

    else:
         #it's an equal value, so we just set the count to the current value
         top_item['count'] = current_count

затем, в вашем html

 <section
        style="color: black;"><h2>Top 3 Purchases</h2>
     <ol>
     {% for item in list_of_purchases %}
          <li>{{item.count}}. {{ item.name }}</li>
     {% endfor %}
     </ol>
Вернуться на верх