【问题标题】:How to display {% django block %} dynamically with for loop?如何使用 for 循环动态显示 {% django block %}?
【发布时间】:2018-11-11 15:54:09
【问题描述】:

大家好!

我正在为我的网站构建一个仪表板,在左侧部分,我有一个包含多个项目的菜单:HomeMessengerJob Offers ....
创建帐户时,用户可以选择他们的项目、重新订购或删除。

我有MenuItem 模型,

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 时,我知道我有一个名为 item_messenger 的信使 unique_key,我愿意

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

它不起作用,项目Messenger 或我选择的任何东西都没有突出显示,我想知道为什么? 还有其他方法可以实现吗?

任何提示都会有所帮助,在此先感谢!

【问题讨论】:

  • 我不明白您为什么要使用块来执行此操作。为什么不只是一个与唯一键进行比较的变量? &lt;li class="{% if active_key == item.unique_key %}active{% endblock %}"&gt;
  • @DanielRoseman 我这样做是因为在必须以这种方式循环显示元素之前,我在模板中将它们作为一个普通列表单独包含一个类 &lt;li class = '{% block item_name %} {% endblock %}'&gt;。然后在每一页的顶部,我添加{% block item_name %} active {% endblock %}。我的所有页面顶部都带有block 标签,这就是为什么我必须在循环中使用block。你给我看的方式,我已经想到了,但这需要我在每个视图中都有active_key作为上下文变量;我有很多意见。

标签: django django-templates


【解决方案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>

【讨论】:

  • 谢谢你的回答,你能不能看看我上面的回复(问题cmets),这样你就明白我为什么用block了
猜你喜欢
  • 2021-08-15
  • 1970-01-01
  • 2019-10-08
  • 2017-03-27
  • 2021-01-11
  • 2018-09-09
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多