Как динамически отображать {% django block %} с помощью цикла for?

Здравствуйте, замечательные люди!

Я создаю панель инструментов для своего веб-сайта, в левой части у меня есть меню, содержащее несколько элементов: Home, Messenger, Job Offers ....
При создании учетной записи пользователи могут выбирать свои элементы, повторно заказать или удалить.

У меня есть модели Menu и Item,

class Menu(models.Model):
     items = models.ManyToManyField('Item',blank=True)

class Item(models.Model):
     name = models.CharField(max_length=100)
     unique_key = models.CharField(max_length=100,unique=True)
     url = ......

Для меню пользователя в моем base_template я отображаю элементы текущих пользователей с помощью цикла for. С помощью класса CSS я хочу выделить текущее представление, текущий элемент.
Когда пользователь посещает свой мессенджер, я хочу выделить этот элемент мессенджера с помощью класса CSS.

 <ul>
     {% for item in user.menu.items.all %}
     <li class='{% block item.unique_key %}{% endblock %}'>
          <a href="{{item.url}}"> {{item.name}}</a>
     </li>
     {% endfor %}
 </ul>

Теперь, находясь, например, в messenger.html, зная, что у меня есть unique_key мессенджер под названием item_messenger, я

{% block 'item_messenger' %}active{% endfor%}

Не работает, пункт Messenger или что я выбираю не подсвечивается, интересно почему? Есть ли другой способ добиться этого?

Любая подсказка будет полезна, заранее спасибо!


person Community    schedule 01.06.2018    source источник
comment
Я не могу понять, почему вы хотите сделать это с блоком. Почему бы не просто переменную, которую вы сравниваете с уникальным ключом? <li class="{% if active_key == item.unique_key %}active{% endblock %}">   -  person Daniel Roseman    schedule 01.06.2018
comment
@DanielRoseman Я сделал это, потому что, прежде чем отображать элементы таким образом с помощью цикла, они были в шаблоне в виде обычного списка, индивидуально содержащего класс <li class = '{% block item_name %} {% endblock %}'>. А затем вверху каждой страницы я добавляю {% block item_name %} active {% endblock %}. У меня уже есть все страницы с тегом block вверху, поэтому мне пришлось делать block в цикле. То, как вы мне показываете, я уже думал, но для этого мне потребуется active_key в качестве переменной контекста в каждом представлении; У меня много просмотров.   -  person    schedule 01.06.2018


Ответы (1)


Вы пытаетесь заставить тег блока интерпретировать переменную как ее имя. Это не работает.

Вам нужно будет передать ключ активного элемента в контексте шаблона, а затем в вашем base_template вы можете просто сделать простой оператор if, чтобы добавить класс active в правильную запись.

<ul>
    {% for item in user.menu.items.all %}
        <li class='{% if item.unique_key == active_key %}active{% endif %}'>
            <a href="{{item.url}}"> {{item.name}}</a>
        </li>
    {% endfor %}
</ul>
person Bran Handley    schedule 01.06.2018
comment
спасибо за ваш ответ, вы можете взглянуть на мой ответ выше (комментарии к вопросу), чтобы вы поняли, почему я сделал это с блоком - person ; 01.06.2018