Для примера – возьмём приложение “Домашняя бухгалтерия“, описанный в посте Django: создание проекта “домашняя бухгалтерия”.
Например – я хочу, что бы общая доступная сумма, которая сейчас отображается только в index()
– отображалась на страницах index
и transactions
.
Реализуется это очень просто.
Создадим новую функцию total_avail()
в файле views.py
:
... def total_avail(): total = Source_types.objects.aggregate(Sum('source_sum')) return total ...
И изменим определение переменной total
в представлении index()
, изменив его с такого:
def index(request): ... total = Source_types.objects.aggregate(Sum('source_sum')) ....
на такое:
... total = total_avail() ...
Проверяем:
$ curl -u user:pass http://money.domain.org.ua/money/index | grep Всего ... <p>Всего: 29479</p>
Теперь при обращении к index.html
вызывается два представления – само index()
через URLconf
и total_avail()
– из index(
).
Работает.
Теперь – изменим представление transactions()
, добавив и в него вывод общей доступной суммы:
... def transactions(request): ... total = total_avail() return render(request, 'transactions.html', { ... 'total': total.get('source_sum__sum'), }) ...
И файл шаблона transactions.html
:
... {% block content %} <p>Всего доступно: {{ total }}</p> ...
Готово:
Что бы ещё лучше это сделать – можно создать отдельный шаблон total.html
, и его с помощью include
включать в шаблоны.
Или в файле base.html
сделать блок {% block total %}
, предварительно проверив наличие переменной total
, что бы не отображать пустое поле:
{% if total %} <hr> {% block total %} <p>Всего доступно: {{ total }}</p> {% endblock %} {% endif %}