2017-11-24 3 views
0

Ich verwende ein benutzerdefiniertes Widget, um den Kontext für die Widgetvorlage zu ändern (fügen Sie weitere Informationen hinzu).Wie kann ich den forloop.counter0 als Schlüssel in Django verwenden? Vorlage

Kontext:

'selected': [[3, 9], [3, 4, 7, 6]], 'depth_levels': {0: [{'name': 'Category A', 'value': 3, 'depth': 0, 'parent_id': None, 'children': [4, 9]}, {'name': 'Category B', 'value': 8, 'depth': 0, 'parent_id': None, 'children': []}], 1: [{'name': 'Category A_1', 'value': 4, 'depth': 1, 'parent_id': 3, 'children': [5, 7]} 

{% for path in widget.selected %} 
     {% for selected in path %} 

      {% for level in widget.depth_levels.forloop.counter0 %} 
       {{ level }} 

      {% endfor %} 
     {% endfor %} 
    {% endfor %} 

Zuerst I-Zyklus durch die ausgewählte (Strecke) und die interne Arrays (ausgewählt). Ich möchte die {{forloop.counter0}} als Schlüssel für depth_levels verwenden.

Das Problem: {{widget.depth_levels.forloop.counter0}} gibt nichts zurück.

Der forloop.counter wird nicht als Index für eine Liste verwendet, aber er wird als Schlüssel für ein Wörterbuch verwendet.

Verwenden von '.' Zugriff ist die Standardmethode, mit der Django-Vorlagen auf ein Wörterbuch zugreifen. * Mit '0', '1' - {{widget.depth_levels.0}} - usw. anstelle von forloop.counter0 funktioniert es.

wieder ein eigenes Template-Tag ist ein Problem, weil der Zugang in einem for und nicht {{}} innen verwenden können:

{% for level in widget.depth_levels.forloop.counter0 %} 

Die Schlüssel, die ich brauche depth_levels zugreifen sind von 0 auf die Länge von jedem Array innerhalb der selected, die 'Pfad' Array im Beispiel.

Die Werte in ausgewählten Arrays sagen mir später, wo Attribute hinzugefügt werden, sind nicht mit den Schlüsseln von depth_levels verwandt.

Mein Endziel ist der Zugriff auf die name, value in den Wörterbüchern, die im Array sind.

+0

[Dies] (https://stackoverflow.com/questions/2376511/how-to-access-outermost-forloop-counter-with-nested-for-loops-in-django-template) könnte helfen –

+1

Mögliches Duplikat von [Referenzliste Element für Index innerhalb der Django-Vorlage?] (Https://stackoverflow.com/questions/4651172/reference-list-item-by-index-within-django-template) – Sayse

+1

^siehe zweite Antwort – Sayse

Antwort

2

Sie einen Filter wie folgt hinzufügen kann (mehr wissen: https://docs.djangoproject.com/en/1.11/howto/custom-template-tags/#writing-custom-template-filters):

@register.filter 
def value_by_key(d, key):  
    return d[key] 

Dann ist es wie folgt verwenden:

% for path in widget.selected %} 
    {% for level in widget.depth_levels|value_by_key:path|length %} 
     {{ level }} 
    {% endfor %} 
{% endfor %} 
+0

Die Schlüssel, die ich brauche, sind von 0 bis die Länge der einzelnen Array innerhalb des Pfades, so dass die ausgewählte ist nicht der Schlüssel, deshalb brauche ich die {{forloop.counter }} Im Vergleich zu Ihrem Beispiel gehe ich auch eine Ebene tiefer – user3541631

+0

So können Sie "Forloop.Counter" statt "ausgewählt" (ohne invertierte Angebot) –

0

Wenn Ihr Endziel jeden Namen zuzugreifen ist, Wert in den Wörterbüchern, die im Array sind, sollten Sie so etwas tun.

{% for path in widget.selected %} 
    {% for selected in path %} 
     {% for key, level in widget.depth_levels.items %} 
      {% for key_obj in level %} 
       {{ key_obj.name }} 
       {{ key_obj.value }} 
      {% endfor %} 
     {% endfor %} 
    {% endfor %} 
{% endfor %} 
+0

Die Schlüssel, die ich brauche, sind von 0 bis die Länge der einzelnen Array Innerhalb des Pfades, also ist der ausgewählte Schlüssel nicht der Schlüssel, deshalb brauche ich {{forloop.counter}}. Das Ziel ist, auf Namen basierend auf Arrays in ausgewählter Länge zuzugreifen, nicht alle notwendig. – user3541631

+0

Geben Sie ein Beispiel aus was du willst. Es ist sehr unklar von Ihrer Frage, was Sie wollen. –

Verwandte Themen