Лучший способ использовать "контекст" в шаблонах 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 }}