在Django模板中使用for循环自动获取列的名称

时间:2018-08-17 19:12:48

标签: python django templates for-loop columnname

我想使用for循环自动检索列的名称。 如果我知道列的名称,则可以通过以下方式编写模板:

WHERE

但是在我目前的情况下,我不知道表中各列的名称。如何显示它们?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式获取模型的字段:

fields = Model._meta.get_fields()

这是Field [GitHub]个对象的元组。这些Field对象具有name属性,因此我们可以通过以下方式获取字段名称:

from operator import attrgetter

field_names = map(attrgetter('name'), Model._meta.get_fields())

如果我们不知道模型是什么,可以使用type(..)获得对模型实例模型的引用:

fields = type(some_instance)._meta.get_fields()

但是,所有这些逻辑实际上并不真正属于Django模板,而是属于视图(根据设计,Django模板在防止在模板中编写业务逻辑方面有一定的限制)。因此,我们可以将字段名称列表传递给模板:

def some_view(request):
    teams = Team.objects.all()
    field_names = [f.name for f in Team._meta.get_fields()]
    return render(request, 'some_template.html',
        {'teams': teams, 'field_names': field_names}
    )

但是,如果您想打印这些团队的值,那么这仍然将不起作用,因为我们不能轻易地在模板中获取任意属性。然后,我们可以再次将处理移至视图:

from operator import attregetter

def some_view(request):
    teams = Team.objects.all()
    field_names = [f.name for f in Team._meta.get_fields()]
    atgetters = [attrgetter(fn) for fn in field_names]
    rows = [[ag(team) for ag in atgetters] for team in teams]
    return render(request, 'some_template.html',
        {'teams': teams, 'field_names': field_names, 'data': data}
    )

因此,data是包含列表的列表,因此data[i][j]包含field_name[j]的名称为teams[i]的字段的值。