Что здесь не так? Перебор словаря в шаблоне Django - PullRequest
7 голосов
/ 08 февраля 2010

Я пытаюсь перебрать словарь значений модели в шаблоне 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 ]

29 голосов
/ 08 февраля 2010

Для перебора словаря вам не понадобится:

<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>

Но только потому, что я не настолько хорошо знаком с тем, как много может сделать разыменование системы шаблонов. Видя, как вы понимаете, как его почитать, вы экономите усилия, чтобы средство визуализации работало.

1 голос
/ 08 февраля 2010

Итерация по dict дает его ключи. Я не знаю, почему Django считает, что вы хотите выполнить неполное раскрытие последовательности имени ключа вместо того, чтобы выдавать исключение, но я записал его до ANOTHER одной из причуд движка шаблонов Django. *

В любом случае, да, получите key от dict в вашем цикле for, затем используйте key и dict.key внутри него.

0 голосов
/ 08 февраля 2010

Вы получаете странные результаты, потому что я думаю, что вы перебираете символы строки. Цикл for в шаблонах django не такой, как в python. Попробуйте использовать объект и выполнить итерации через методы доступа к свойству for object in my objects, а затем использовать object.prop1 object.prop2.

...