Есть ли способ узнать, когда я передал последний элемент при итерации по словарю в шаблоне 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 }}