Django:在模板中列出模型字段名称和值

7 投票
2 回答
20557 浏览
提问于 2025-04-16 13:59

可能重复的问题:
Django - 在模板中遍历模型实例的字段名称和值

你好,

我想在模板中列出通用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 原则的方法也欢迎分享。

2 个回答

3

你需要创建一个自己的过滤器,它的功能和Python中的getattr一样,然后在模板中使用它:

{{ object|getattribute:field }}

这里有个说明,教你怎么做:在Django模板中执行getattr()风格的查找

不过我觉得这样做并不是个好主意。你可以尝试把这个逻辑放在视图中,像这样:

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的模板系统并没有提供很多功能(过滤器),因为你应该在视图中处理所有的逻辑。模板只需要展示数据。

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

撰写回答