Есть ли способ узнать, когда я передал последний элемент при итерации по словарю в шаблоне django?

Я пытаюсь создать текстовое представление JSONField, содержащего некоторые данные, структурированные в виде массива словарей, следующим образом:

[
 {
  "key1":"value1",
  "key2":"value2"
 },
 {
  "key3":"value3",
  "key4":"value4",
  "key5":"value5"
 }
]

Моя цель - представить эти данные в шаблоне Django следующим образом:

( key1=value1 & key2=value2 ) || ( key3=value3 & key4=value4 & key5=value5 )

Теперь я пройдусь по массиву и посмотрю, не попал ли я в последний словарь, чтобы добавить || между текстом представления условия, поскольку это уже список массива, например:

{% for dict in data %}
 // Do stuff with dict
 {% if data|last != dict %}
  ||
 {% endif %}
{% endfor %}

Однако, поскольку словарь не имеет last, мне трудно перебирать "ключ,значение", когда я делаю что-то с каждым объектом словаря, когда я должен добавлять "&" только если я не попадаю в конец элементов этого словаря.

{% for k,v in dict %}
 k=v
 // append "&" if this is not the last key being iterated?
{% endfor %}

Любые предложения/обходные пути/идеи будут высоко оценены :)

Только что нашел! Глупый я, похоже, что Django уже предоставляет довольно аккуратный встроенный объект forloop для шаблонов, который работает как шарм!

Пожалуйста, оставьте это здесь для тех, у кого может возникнуть такая же проблема

{% for k,v in dict %}
 k=v
 {% if forloop.last != True %}
 &
 {% endif %}
{% endfor %}

Вы можете использовать not, что, вероятно, немного более читабельно:

{% for k,v in dict %}
  {{ k }}={{ v }}
  {% if not forloop.last %}
    &
  {% endif %}
{% endfor %}

Но мне кажется, что вы форматируете строку запроса [wiki]? Я бы настоятельно рекомендовал не форматировать это вручную, а также не использовать шаблонную логику, так как шаблонизатор Django не очень быстрый.

Вместо этого используйте QueryDict [Django-doc] в Django. Действительно, в представлении мы можем сделать QueryDict из dict с помощью:

from django.http import QueryDict

qd = QueryDict(mutable=True)
qd.update(my_dict)

и отобразите его в шаблоне как:

{{ qd.urlencode }}
Вернуться на верх