【问题标题】:Automatically get name of the column with for loop in django template在 django 模板中使用 for 循环自动获取列的名称
【发布时间】:2018-08-17 19:12:48
【问题描述】:

我想使用 for 循环自动检索列的名称。 如果我知道列的名称,我可以这样编写模板:

<ul>
{% for co in team %}
    <li>{{ co.name }}</li>
    <li>{{ co.team}}</li>
    <li>{{ co.sport}}</li>
{% endfor %}
</ul>

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

谢谢

【问题讨论】:

  • 我认为你应该在视图中编写这个逻辑,而不是在模板中。 Django 模板的表达性已(故意)受到限制,以避免人们在模板中编写此类行为。
  • 检查这个答案 ==> stackoverflow.com/a/2170243/8150371

标签: python django templates for-loop columnname


【解决方案1】:

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

fields = Model<b>._meta.get_fields()</b>

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

from operator import attrgetter

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

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

fields = <b>type(some_instance)</b>._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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2012-07-25
    • 2014-02-21
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多