在模板中遍历模型实例字段名和值

206 投票
24 回答
216651 浏览
提问于 2025-04-15 18:41

我正在尝试创建一个基本的模板,用来显示选定实例的字段值和它们的名称。可以把它想象成一个标准的输出,显示该实例的值,格式是表格,第一列是字段名称(如果字段上指定了详细名称,就用详细名称),第二列是该字段的值。

举个例子,假设我们有以下的模型定义:

class Client(Model):
    name = CharField(max_length=150)
    email = EmailField(max_length=100, verbose_name="E-mail")

我希望在模板中输出成这样(假设有一个实例,包含给定的值):

Field Name      Field Value
----------      -----------
Name            Wayne Koorts
E-mail          waynes@email.com

我想要实现的是能够将模型的一个实例传递给模板,并在模板中动态地遍历它,类似于这样:

<table>
    {% for field in fields %}
        <tr>
            <td>{{ field.name }}</td>
            <td>{{ field.value }}</td>
        </tr>
    {% endfor %}
</table>

有没有一种简单的、符合“Django标准”的方法来做到这一点?这似乎是一个非常常见的任务,而我在这个项目中需要经常这样做。

24 个回答

81

最后在开发者邮件列表上找到一个不错的解决方案:

在视图中添加:

from django.forms.models import model_to_dict

def show(request, object_id):
    object = FooForm(data=model_to_dict(Foo.objects.get(pk=object_id)))
    return render_to_response('foo/foo_detail.html', {'object': object})

在模板中添加:

{% for field in object %}
    <li><b>{{ field.label }}:</b> {{ field.data }}</li>
{% endfor %}
86

你可以使用Django的to-python查询集序列化器。

只需在你的视图中放入以下代码:

from django.core import serializers
data = serializers.serialize( "python", SomeModel.objects.all() )

然后在模板中:

{% for instance in data %}
    {% for field, value in instance.fields.items %}
        {{ field }}: {{ value }}
    {% endfor %}
{% endfor %}

它的一个大优点是可以处理关系字段。

如果你只想处理部分字段,可以试试:

data = serializers.serialize('python', SomeModel.objects.all(), fields=('name','size'))
194

自从Django 1.9版本开始:可以使用 model._meta.get_fields() 来获取模型的所有字段,然后用 field.name 来获取每个字段的名称。

在Django 1.9之前:可以使用 model._meta.get_all_field_names() 来获取模型的所有字段名称,然后可以用 model._meta.get_field() 来找到详细名称,最后用 getattr(model_instance, 'field_name') 来获取模型中某个字段的值。

撰写回答