Я пытаюсь выполнить итерации по словарю образцовых значений в шаблоне 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>
просто производит пустой список....
Для перебора словаря вам не понадобится:
<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.
В любом случае, да, возьмите ключ
из dict в вашем цикле for, затем используйте ключ
и dict.key
внутри него.
Вы получаете странные результаты, потому что я думаю, вы перебираете символы строки. Цикл for в шаблонах django не такой, как в python. Попробуйте использовать объект и выполнить итерацию с помощью средств доступа к свойствам для объекта в моих объектах
, а затем используйте вместо него object.prop1
object.prop2
.