จะแสดง {% django block %} แบบไดนามิกด้วย for loop ได้อย่างไร

สวัสดีทุกคน!

ฉันกำลังสร้างแดชบอร์ดสำหรับเว็บไซต์ของฉัน ในส่วนด้านซ้าย ฉันมีเมนูที่มีหลายรายการ : 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 loop ด้วยคลาส CSS ฉันต้องการที่จะเน้นมุมมองปัจจุบัน รายการปัจจุบัน
เมื่อผู้ใช้เยี่ยมชม Messenger ของเขา ฉันต้องการเน้นรายการ Messenger นั้นด้วยคลาส CSS

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

ตอนนี้ เมื่ออยู่ใน messenger.html เช่น เมื่อรู้ว่าฉันมี unique_key สำหรับ Messenger ชื่อ 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="/th{{item.url}}"> {{item.name}}</a>
        </li>
    {% endfor %}
</ul>
person Bran Handley    schedule 01.06.2018
comment
ขอบคุณสำหรับคำตอบ คุณช่วยดูคำตอบของฉันด้านบนได้ไหม (ความคิดเห็นของคำถาม) แล้วคุณจะเข้าใจว่าทำไมฉันถึงทำแบบนั้นกับบล็อก - person ; 01.06.2018