可能重复:
Django - Iterate over model instance field names and values in template
您好,
我正在尝试在模板中列出通用Django模型的字段和相应值。但是,我找不到一个针对相当常见问题的内置解决方案。我非常接近解决方案,但找不到出路。
view.py代码:
def showdetails(request, template):
objects = newivr1_model.objects.all()
fields = newivr1_model._meta.get_all_field_names()
return render_to_response(template, {'fields': fields,'objects':objects},
context_instance=RequestContext(request))
模板代码:
<table>
{% for object in objects %}
<tr>
{% for field in fields %}
<td>
<!-- {{ object.field }} /*This line doesn't work*/ -->
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
我应该在评论的模板行做什么,以便获得Object.field的值?
任何更好的DRY方法也是最受欢迎的。
答案 0 :(得分:5)
不幸的是,你不能在模板引擎中进行类似的查找。
你必须在视图中处理它。
def showdetails(request, template):
objects = newivr1_model.objects.all()
for object in objects:
object.fields = dict((field.name, field.value_to_string(object))
for field in object._meta.fields)
return render_to_response(template, { 'objects':objects },
context_instance=RequestContext(request))
{% for object in objects %}
<tr>
{% for field, value in object.fields.iteritems %}
<td>{{ field }} : {{ value }}</td>
{% endfor %}
</tr>
{% endfor %}
答案 1 :(得分:2)
你需要创建自己的过滤器,它将像python中的getattr一样工作并在模板中使用它:
{{ object|getattribute:field }}
这里有描述如何执行此操作:Performing a getattr() style lookup in a django template
但我认为这不是一个好主意。 Insted尝试在视图中执行此逻辑,如下所示:
object_values = []
for object in objects
object_values.append([])
for field in fields:
object_values[-1].append(getattr(object, field))
return render_to_response(template, {'object_values': object_values},
context_instance=RequestContext(request))
并在模板中:
<table>
{% for values in object_values %}
<tr>
{% for value in values %}
<td>
{{ value }}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
Django模板系统不提供很多功能(过滤器),因为你应该在视图中做所有的逻辑。模板应该只显示数据。