Почему мой упорядоченный список с переменной шаблона показывает цифру один для каждой записи?
Буду признателен за помощь в выяснении того, почему мой упорядоченный список с переменными шаблона показывает цифру один для каждого элемента. Я также хотел бы знать, как исправить это и представить список по возрастанию.
Вот что происходит: Я пытаюсь показать три самых продаваемых товара. В одном из топ-товаров есть три ничьи, поэтому я должен показать пять товаров. Я вижу пять товаров, но каждый из них обозначен как номер один.
Вот как это выглядит:
Вот мой код:
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>