Как передать и интерпретировать сложный контекст рендеринга в 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 %}
    
    Вернуться на верх