django - Подсчет объектов и сумм значений в поле - PullRequest
0 голосов
/ 06 августа 2020

Я хочу включить базовую c статистику модели в файл stats. html. Переменные не отображаются в html. Что я делаю не так?

from django.shortcuts import render, get_object_or_404, redirect
from django.db.models import Avg, Sum, Count
from .models import Production

def statistics(request):
    nr_of_plays = Production.objects.count()
    nr_of_actors = Production.objects.aggregate(num_actors=Sum('nr_actors'))
    nr_of_audience = Production.objects.aggregate(num_audience=Sum('est_audience'))
    context = {
        'nr_of_plays': nr_of_plays,
        'nr_of_actors': nr_of_actors['num_actors'],
        'nr_of_audience': nr_of_audience['num_audience'],
        'test':'abc'
    }
    return render(request, 'stats.html', context)

Модель:

class Production(models.Model):
    title = models.CharField(max_length=200)
    nr_actors = models.IntegerField(default=0)
    est_audience = models.IntegerField(default=0)
    ...

urls.py:

path('stats/', views.statistics, name='stats'),

соответствующий раздел базы. html:

<copyright class="text-muted">
    <div class="container text-center">
        <p>&copy; One World Theatre - {% now "Y" %} {% include 'stats.html' with test=test %}  </p>
    </div>
</copyright>

И статистика. html шаблон:

{% load static %}

{{ test }} - Stats: {{ nr_of_plays }} plays produced, involving {{ nr_of_actors }} actors, seen by {{ nr_of_audience }} people.

результат: © One World Theater - 2020 - Статистика: поставленные пьесы с участием актеров, просмотренные люди.

РЕДАКТИРОВАТЬ:

Я не упоминал, что использую свой шаблон stats.html в моем base.html шаблоне, например, {% include 'stats.html' %}. Когда я добавляю with test=test к тегу include, отображается тестовый текст. Но при добавлении with nr_of_plays=nr_of_plays ничего не происходит: - /.

Я забыл о попытке {% include 'stats.html' %} в моем базовом шаблоне и просто добавил те переменные там, где они мне нужны, отлично работает. Не DRY, а что делать ...

РЕДАКТИРОВАТЬ 2:

Я был слишком быстр, чтобы плакать о победе. Отредактировал вопрос с последним кодом. Передача переменных в представление, которое обрабатывает основной блок содержимого, работает, но это означает, что мне придется добавлять их в каждое отдельное представление (а не DRY). Все еще не получаю то, что не работает с моей настройкой. example.com/stats.html отображает именно то, что я хочу, но не показывает переменные, когда я include это в моем base.html. with test=test ничего не делает. Бестолковые (и благодарные за помощь).

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Основываясь на вашем последнем признании и симптомах, вы, похоже, не переходите к вашему statistics представлению.

Похоже, что URL-адрес отображает другое представление, которое также расширяет base.html, что вас смущает. вы находитесь в правильном представлении.

Один из способов проверить это - поместить оператор печати в ваше statistics представление и посмотреть, печатает ли он что-нибудь в консоли:

def statistics(request):
    print(111111111111111111111111111111)
    ...
    return render(request, 'stats.html', context)

Second дело в том, что если ваш base.html включает stats.html, вы не должны напрямую отображать stats.html, вы должны передать контекст в шаблон, который расширяет base.html.

В-третьих, обратитесь на ответ Pynchia, чтобы правильно получить количество агрегированных запросов.

1 голос
/ 06 августа 2020

Aggregate возвращает словарь.

Вам нужно получить доступ к его значению с помощью ключа

context = {
        'nr_of_plays': nr_of_plays,
        'nr_of_actors': nr_of_actors['nr_actors_sum'],
        'nr_of_audience': nr_of_audience['est_audience_sum']
    }

В качестве альтернативы вы можете указать собственное имя ключа вместо значения по умолчанию составной:

    nr_of_actors = Production.objects.aggregate(num_actors=Sum('nr_actors'))
    nr_of_audience = Production.objects.aggregate(num_audience=Sum('est_audience'))

Примечание: .all() является избыточным и может быть удален

...