Django: два представления в одном URL

Автор: | 05/17/2015
 

django_logo_2Для примера — возьмём приложение «Домашняя бухгалтерия«, описанный в посте 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>
...

Готово:

money_10

Что бы ещё лучше это сделать — можно создать отдельный шаблон total.html, и его с помощью include включать в шаблоны.

Или в файле base.html сделать блок {% block total %}, предварительно проверив наличие переменной total, что бы не отображать пустое поле:

    {% if total %}
        <hr>
        {% block total %}
            <p>Всего доступно: {{ total }}</p>
        {% endblock %}
    {% endif %}