Лучший способ использовать "контекст" в шаблонах Django для многих переменных / словарей

Я хочу отправить много данных в 1 шаблон Django (чтобы показать их на 1 конкретной странице).

Данные получены из двух источников:

  • По крайней мере 1 список, с большим количеством словарей внутри (я не могу ничего изменить из этого, это происходит из Google Ads API).
  • Множество переменных (я могу изменить их, например, превратить в словари или кортежи, если это необходимо. если потребуется).

Переменные очень простые, что-то вроде "variable = other_variable / 100" (только 1 значение, ключ не нужен), поэтому мне не нужно, чтобы переменные превращались в словарь.

Но Я понял (возможно, ошибочно), что "контекст" из рендера Django нуждается в словарях.

Данные переменных поступают из списка (я делаю некоторые вычисления, используя некоторые значения из списка), но, возможно, это не имеет отношения к моему вопросу.

Прямо сейчас я делаю что-то вроде этого в своем views.py:

campaign_data = []

CODE TO FILL THAT LIST WITH API DATA (MANY DICTIONARIES INSIDE)

clicks = sum(data['campaign_clicks'] for data in campaign_data)
sum_clicks = {"sum_clicks" : clicks}

context = {
'campaign_data' : campaign_data,
'sum_clicks' : sum_clicks
}
return render(request, 'testing.html', context)

А затем в шаблоне Django я использую данные из views.py следующим образом:

{% for element in campaign_data %} 
{{ element.campaign_name }}
{{ element.campaign_budget }}
{% endfor %}


{% for key, value in sum_clicks.items %}                  
{{key}} - {{value}}                  
{% endfor %}

Это работает, но кажется, что это много "лишних шагов" (создание словаря, который мне на самом деле не нужен, только для того, чтобы передать его в контекст, выполнение цикла для словаря, который имеет только 1 ключ-значение...).

И я собираюсь использовать много таких переменных или "дополнительных словарей" (не только 1, как в этом примере), так что это будет иметь значение.

Есть ли более простой и/или эффективный способ сделать это?

Я новичок в Python и Django, поэтому я не совсем понимаю, что делаю.

Спасибо!

Контекст действительно должен быть в форме словаря, однако вы также можете отправлять экземпляры объектов, например, простые классы или модели. Возьмем такой пример:

class Car:
    colour: str
    owner_names: List[str]

    def __init__(self):
        ...

И вы можете отправить экземпляр в качестве контекста:

car = Car(..)
return render(request, 'testing.html', {"car": car})

Это особенно полезно, если вы используете models.py для создания схемы базы данных; вы можете отправлять экземпляры моделей!

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

Но я понял (возможно, неправильно), что "контекст" из рендера Django нуждается в словарях.

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

campaign_data = []

# code to fill that list with API data (many dictionaries inside)

clicks = sum(data['campaign_clicks'] for data in campaign_data)

context = {
    'campaign_data' : campaign_data,
    'sum_clicks' : clicks
}
return render(request, 'testing.html', context)

и затем отобразить это как:

{% for element in campaign_data %} 
    {{ element.campaign_name }}
    {{ element.campaign_budget }}
{% endfor %}

Total number of clicks - {{ sum_clicks }}
Вернуться на верх