จะใช้ดัชนีปัจจุบันเพื่อรับค่าของอาร์เรย์อื่นได้อย่างไร

ฉันได้อ่านสิ่งนี้แล้ว และฉันมี อาร์เรย์เช่นนั้น:

context[u'erreurs'] = {
    'aa': {'titres': [], 'liste': [], 'urls': []},
    'bb': {'titres': [], 'liste': [], 'urls': []},
    '...': {'titres': [], 'liste': [], 'urls': []}
}

หากมีข้อผิดพลาด 'titres', 'liste' และ 'urls' จะกลายเป็นอาร์เรย์ของสตริงซึ่งเต็มไปด้วยค่าที่เพียงพอ

ในเทมเพลตของฉัน หากมีการตั้งค่าข้อผิดพลาด ฉันจะทำสิ่งนี้:

    {% for idx, tab in erreurs.items %}
        <ul>
        {% for e in tab.liste %}
            {% if user.is_authenticated %}
            <li><a href="/th{{ tab.urls[forloop.counter0] }}">{{ e }}</a></li>
            {% else %}
            <li>{{ e }}</li>
            {% endif %}
        {% endfor %}
        </ul>
    {% endfor %}

ฉันต้องการใช้ดัชนีปัจจุบันเพื่อใช้ค่าที่อยู่ในอาร์เรย์อื่นที่นี่: tab.urls มันใช้งานไม่ได้และทำให้ฉันมีข้อผิดพลาด:

Could not parse the remainder: '[forloop.counter0]' from 'tab.urls[forloop.counter0]'

วิธีแก้ปัญหานี้?


person Olivier Pons    schedule 09.01.2016    source แหล่งที่มา


คำตอบ (2)


ขออภัย เทมเพลตของ Django ไม่รองรับไวยากรณ์ดังกล่าว คุณควรรวบรวมตัวกรองเทมเพลตที่กำหนดเอง:

# yourapp/templatetags/yourapp_tags.py:
from django import template
register = template.Library()

@register.filter
def at_index(array, index):
    return array[index]

และใช้มันเหมือน:

{% load yourapp_tags %}
{{ tab.urls|at_index:forloop.counter0 }}
person Alex Morozov    schedule 09.01.2016
comment
ตกลง แต่ฉันขอวิธีแก้ปัญหาหรืออาจมีข้อเสนอแนะว่าต้องทำอย่างไร ขอบคุณมาก - person Olivier Pons; 09.01.2016

คุณต้องสร้างแบบจำลองจริงที่แสดงถึงข้อมูล จากนั้นงานจะกลายเป็นเรื่องไม่สำคัญ

class YourModel(object):
    titre = ''
    liste = '' 
    url = ''

context[u'erreurs'] = {
    'aa': [],  # List of model
}

{% for idx, tab in erreurs.items %}
    <ul>
    {% for model in tab %}
        {{ model.titre }}
        {{ model.liste }}
        {{ model.url }}
    {% endfor %}
    </ul>
{% endfor %}
person Sayse    schedule 09.01.2016
comment
ขอบคุณสำหรับคำตอบของคุณ แต่ titre, liste และ url เป็นอาร์เรย์ ดังนั้นฉันจึงไม่สามารถจัดการพวกมันแบบนี้ได้ - person Olivier Pons; 10.01.2016
comment
@OlivierPons - แน่นอนว่าคุณทำได้ มันเป็นเพียงขั้นตอนก่อนการประมวลผลในการแปลงสามอาร์เรย์ให้เป็นอาร์เรย์วัตถุเดียวก่อนที่จะกำหนดให้กับบริบท - person Sayse; 10.01.2016