Что здесь не так? Итерация по словарю в шаблоне Django
Я пытаюсь перебрать словарь значений модели в шаблоне Django - я хочу перечислить verbose_name каждого поля модели вместе с его значением.
вот что у меня есть в models.py:
class Manors(models.Model):
structidx = models.IntegerField(primary_key=True, verbose_name="ID")
county = models.CharField(max_length=5, null=True, blank=True, verbose_name="County")
def get_fields(self):
d = {}
#d["database"] = "pubs"
#d["uid"] = "sa"
for field in Manors._meta.fields:
d[field.verbose_name(self)] = field.value_to_string(self)
return d
и в views.py:
manor_stats = Manors.objects.get(structidx__exact=id)
return render_to_response('template.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request))
и в шаблоне:
<h4>Statistics</h4>
<ul>
{% for key, value in manor_stats.get_fields %}
<li> {{ key }}: {{ value }} </li>
{% endfor %}
</ul>
но я просто получаю странный, искаженный список, как:
u: i
d: a
он даже не работает, если я использую жестко закодированные значения в models.py (как показано в комментарии выше).
что здесь не так? Пытался разобраться в этом в течение нескольких часов: (
---------- обновлено ---------------
изо
def get_fields(self):
d = {}
for field in Manors._meta.fields:
d[field.verbose_name(self)] = { "verbose": field.verbose_name(self), "value": field.value_to_string(self) }
return d
и в шаблоне:
<h4>Statistics</h4>
<ul>
{% for key, value in manor_stats.get_fields %}
<li> {{ key }}: {{ value }}</li>
{% endfor %}
</ul>
просто создает пустой список....
3 ответов
для итерации словаря вам не понадобится:
<h4>Statistics</h4>
<ul>
{% for key, value in manor_stats.get_fields.items %}
<li> {{ key }}: {{ value }}</li>
{% endfor %}
</ul>
но я бы предложил сначала получить словарь из функции:
Views.py:
manor_stats = Manors.objects.get(structidx__exact=id).get_fields()
return render_to_response('template.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request))
и затем:
<h4>Statistics</h4>
<ul>
{% for key, value in manor_stats.items %}
<li> {{ key }}: {{ value }}</li>
{% endfor %}
</ul>
но только потому, что я не так хорошо знаком с тем, насколько разыменование системы шаблонов может сделать. Видя, как вы знаете, как уважать его, вы экономите усилия, чтобы рендерер работал над этим.
итерация по dict дает свои ключи. Я не знаю, почему Django думает, что вы хотите сделать неполное расширение последовательности на имени ключа вместо исключения, но я запишу его до еще один одна из причуд движка шаблонов Django.
В любом случае, да, get key
из dict в вашем цикле for, затем используйте key
и dict.key
внутри него.
вы получаете странные результаты, потому что я думаю, что вы повторяете символы строки. Цикл for в шаблонах django не такой, как в python. Попробуйте использовать объект и итерацию через Property accessors for object in my objects
и затем использовать object.prop1
object.prop2
вместо.