2015-08-31 5 views
1

Я читаю все сообщения тегов шаблонов относительно переменной цикла в ключе. По-видимому, Django не поддерживает переменную цикла в ключе, и я не уверен, как использовать шаблонный тег шаблона.Django Template Tag Loop dictionary variable

Я хотел показать что-то подобное, но как я могу достичь этого с помощью цикла {% for i in mData%}?

{{ mData.0.name }} 
{{ mData.1.name }} 
{{ mData.2.name }} 

{{ mData.0.age }} 
{{ mData.1.age }} 
{{ mData.2.age }} 

mData - это список словарей.

mData = { "имя": "Алекс", "возраст": "12"}, { "имя": "Amy", "возраст": "14"} ...

+1

Что является ключевым в этом дело? Потому что это выглядит так: 'mData' - это список словарей. – dhke

+0

да, это список словарей ... любая идея, как я могу это пропустить? Я пробовал {% for loop в mData.forloop.counter.name%}, но это не сработало ... – Arbitel

+0

В этом случае переупорядочите структуру данных в своем представлении, чтобы dict, переданный шаблону, был '{ 'age': [age0, age1, ...], 'name': [name0, name1, ...]} 'и т. д. В противном случае вы вводите код подготовки данных в свой шаблон. – dhke

ответ

2

Учитывая ваши данные в списке словарей, таких как:

my_data = [{"name" : "abc" , "age":20,...}, {} , {}...] 

Вы можете получить доступ ко всем атрибутам каждого словаря в шаблоне t его путь:

{% for dict in my_data %} 
<!-- Here dict would be each of the dictionary in my_data --> 
<!-- You can access elements of dict using dot syntax, dict.property --> 
    {{ dict.name }}, {{ dict.age }}, ... {{ dict.property }} 
{% endfor %} 

Справочные ссылки: Django templating language

Если вы хотите, чтобы структурировать элементы в том порядке, предписанных в технических заданиях, вы можете сделать что-то вроде этого:

Name List: 
{% for dict in my_data %} 
my_data.name 
{% endfor %} 

Age List: 
{% for dict in my_data %} 
my_data.age 
{% endfor %} 

... 
Prpoerty List: 
{% for dict in my_data %} 
my_data.property 
{% endfor %} 
+0

Спасибо! Это действительно работает по назначению !!!Не могу поверить, что решение так просто! Я играл с пользовательским тегом шаблона и читал о джиня и т. Д. И т. Д. Собирался сдаться !! – Arbitel

+1

Просто перейдите к главе языка шаблонов в документах django, она хорошо написана и объяснена множеством примеров. Когда вы пройдете через них, вы получите это. http://www.djangobook.com/en/2.0/chapter04.html – aliasav

+0

Спасибо! Я на самом деле его читал, но еще не мог понять это, и был смущен тегом шаблона, который я прочитал на SO .. Спасибо за подробный ответ тоже! Один последний вопрос, что, если я хочу перебрать все свойства? Могу ли я сделать это со списком, properties = ['name', 'age', ...]? {% for i в свойствах%} my_data.properties {% endfor%} – Arbitel

0
{% for k, v in mData.items %} 
    {{ k }} {{ v }} 

Кстати, PEP8 предлагает назвать переменную как lower + _, но не hump как javascript или другие языки.

+0

Хм это не сработало, так как мне нужно получить доступ к списку словарей ... mData.0.items вместо mData. items – Arbitel

1

Шаблоны шаблонов Django преднамеренно очень легки, поэтому вы не ставите слишком много кода в сам шаблон. Если вам нужно сделать что-то сложное, как цикл над любой другой записью в базе данных, вы должны установить это в views.py вместо шаблона.

Для сценария вы описали, все, что вам нужно сделать, это цикл по списку объектов:

{% for data in datas %} 
    {{ data.name }} 
{% endfor %} 
{% for data in datas %} 
    {{ data.age }} 
{% endfor %} 
+0

Это не сработает ... Мне нужно получить доступ к списку словарей. например. mData.0.name ..... и мне нужно зацикливать от 0 до 1000, а затем назвать, возраст, пол ... и т. д. Любая идея? – Arbitel

+1

W.thin views.py вы можете установить фильтр. mData.objects.all() [: 1000] должен получить первые 1000 записей в базе данных. – TheGRS

1

Это решило проблему для меня

{% for d in mData %} 
{{ d.name }} {{ d.age }} 
{% endfor %} 
+0

Спасибо! Это действительно работает по назначению !!! Не могу поверить, что решение так просто! Я играл с пользовательским тегом шаблона и читал о джиня и т. Д. И т. Д. Собирался сдаться !! – Arbitel

+1

если это работает, вы можете пометить ответ как ответ, и, пожалуйста, воздержитесь от – a134man