Как передать и интерпретировать сложный контекст рендеринга в Django?
Я довольно новичок в Django и не уверен, правильно ли я подхожу к этой проблеме. Мой код представления генерирует карту "многие ко многим". Так что что-то вроде
{'penguin' : ("bird", "black", "flightless", "arctic")},
{'axolotl' : ("reptile", "green")}
{'rhino' : ("mammal", "horn", "heavy")}
and so on... for a lot of different procedurally generated animals
Из этого я пытаюсь сделать страницу, на которой было бы только название животного, а под ним несколько пунктов с характеристиками, как это
Пингвин
и так далее для каждого животного. Количество этих животных и их описания неизвестны и разбираются во время выполнения из xml-файла
.Я думал, что могу просто передать эту структуру в шаблон и использовать язык шаблонов для итераций и вывода, но пока что я чувствую, что мне приходится прыгать через обручи, поэтому я не уверен, делаю ли я что-то неправильно или это просто выходит за рамки Django и мне следует использовать другой фреймворк для такого рода проекта.
.Проблемы, с которыми я сталкиваюсь: У меня проблемы с тем, как передать эту структуру в контекст и сделать ее доступной для использования шаблоном. На данный момент в коде представления у меня есть следующее:
animal_name_list = ()
characteristics_map = {}
for animal in xmlFileAnimals:
characteristics_map[len(animal_name_list)] = animal.chars //gets a list of characteriscs of the animal as a list
animal_name_list.append(animal.name)
Итак, теперь у меня есть список названий животных и двумерный массив characteristics_map, который дает мне характеристики животного на основе смещения животного в его собственном списке, так что это выглядит следующим образом:
characteristics_map[0] = (bird, black ...)
characteristics_map[1] = (reptile, ...)
...
Затем я передаю это в контекст как список и карту следующим образом:
context = {"names_list":animalNames, "char_map":characteristics_map}
В шаблоне я хотел просто сделать что-то вроде
for(uint i = 0; i < names_list.size(); i++)
{
print(names_list[i] + " has the following characteristics ");
for (uint j = 0; j < char_map[i].length(); j++)
{
print(char_map[i][j] + "/n");
}
}
Но я не могу найти никакого способа сделать это в языке шаблонов. Если кто-то может предложить какие-либо предложения о том, как я могу реализовать это в шаблонах или как изменить код так, чтобы большая часть этого происходила в представлении, я буду благодарен.
Сначала вам нужно зарегистрировать фильтр шаблона для получения индекса списка следующим образом:
templatetags/get_index.py
from django import template
register = template.Library()
@register.filter
def get_index(my_list, index):
return my_list[index]
и затем вы можете использовать цикл и использовать этот фильтр в вашем шаблоне следующим образом:
{% for animal in names_list %}
<h3> {{ animal }} </h3>
<ul>
{% for characters in char_map|get_index:forloop.counter0 %}
<li> {{ character }} </li>
{% endfor %}
</ul>
{% endfor %}