Bagaimana cara menggunakan indeks saat ini untuk mendapatkan nilai array lain?

Saya telah membaca ini, dan saya punya susunan seperti itu:

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

Jika terjadi error, 'titres', 'liste' dan 'urls' menjadi array string yang diisi dengan nilai yang memadai.

Di templat saya, jika kesalahan disetel, saya melakukan ini:

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

Saya ingin menggunakan indeks saat ini untuk menggunakan nilai yang ada di array lain, di sini: tab.urls. Itu tidak berfungsi dan memberi saya kesalahan:

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

Bagaimana cara mengatasi ini?


person Olivier Pons    schedule 09.01.2016    source sumber


Jawaban (2)


Sayangnya, cetakan Django tidak mendukung sintaksis seperti itu. Anda harus membuat filter templat khusus:

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

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

dan menggunakannya seperti:

{% load yourapp_tags %}
{{ tab.urls|at_index:forloop.counter0 }}
person Alex Morozov    schedule 09.01.2016
comment
Oke, tapi saya minta solusinya, atau mungkin saran bagaimana cara melakukannya? Terima kasih banyak - person Olivier Pons; 09.01.2016

Anda perlu membuat model aktual yang mewakili data maka tugasnya menjadi sepele

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
Terima kasih atas jawaban Anda, tetapi titre, liste dan url adalah array jadi saya tidak bisa menanganinya seperti ini. - person Olivier Pons; 10.01.2016
comment
@OlivierPons - tentu saja bisa, ini hanya langkah pra-pemrosesan untuk mengubah tiga array menjadi satu array objek sebelum menetapkan konteksnya - person Sayse; 10.01.2016