I’m trying to iterate over a dictionary of model values in a Django template – I want to list the verbose_name of each model field alongside its value.
Here’s what I have in 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
And in 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))
And in the template:
<h4>Statistics</h4>
<ul>
{% for key, value in manor_stats.get_fields %}
<li> {{ key }}: {{ value }} </li>
{% endfor %}
</ul>
But I just get a weird, distorted-looking list like:
u: i
d: a
It doesn’t even work if I use hard-coded values in models.py (as shown commented out above).
What’s wrong here? Been trying to work this out for hours:(
———- UPDATED —————
Trying with
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
and in template:
<h4>Statistics</h4>
<ul>
{% for key, value in manor_stats.get_fields %}
<li> {{ key }}: {{ value }}</li>
{% endfor %}
</ul>
just produces a blank list….
To iterate a dictionary wouldn’t you need:
But I’d suggest retrieving the dictionary from the function first:
Views.py:
And then:
But only because I’m not that familiar with how much dereferencing the templating system can do. Seeing as you know how to deference it you’re saving the effort of having the renderer work it out.