首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >迭代模板中的模型实例字段名称和值

迭代模板中的模型实例字段名称和值
EN

Stack Overflow用户
提问于 2010-01-31 09:48:11
回答 13查看 190.6K关注 0票数 196

我正在尝试创建一个基本模板来显示所选实例的字段值及其名称。可以将其看作是该实例的值以表格格式的标准输出,其中字段名称(如果在字段上指定,则为verbose_name)位于第一列,该字段的值位于第二列。

例如,假设我们有以下模型定义:

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批准的”方法来做到这一点?这似乎是一项非常常见的任务,对于这个特定的项目,我需要经常这样做。

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-01-31 09:54:53

model._meta.get_all_field_names()将为您提供模型的所有字段名,然后您可以使用model._meta.get_field()获取详细名称,使用getattr(model_instance, 'field_name')从模型中获取值。

注意: django 1.9中不推荐使用model._meta.get_all_field_names()。相反,使用model._meta.get_fields()来获取模型的字段,使用field.name来获取每个字段的名称。

票数 182
EN

Stack Overflow用户

发布于 2010-08-08 00:13:18

我在the dev mailing list上找到了一个很好的解决方案

在视图中添加:

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 %}
票数 75
EN

Stack Overflow用户

发布于 2010-02-09 09:29:03

这里是使用模型方法的另一种方法。此版本解析选择列表/选项字段,跳过空字段,并允许您排除特定字段。

def get_all_fields(self):
    """Returns a list of all field names on the instance."""
    fields = []
    for f in self._meta.fields:

        fname = f.name        
        # resolve picklists/choices, with get_xyz_display() function
        get_choice = 'get_'+fname+'_display'
        if hasattr(self, get_choice):
            value = getattr(self, get_choice)()
        else:
            try:
                value = getattr(self, fname)
            except AttributeError:
                value = None

        # only display fields with values and skip some fields entirely
        if f.editable and value and f.name not in ('id', 'status', 'workshop', 'user', 'complete') :

            fields.append(
              {
               'label':f.verbose_name, 
               'name':f.name, 
               'value':value,
              }
            )
    return fields

然后在您的模板中:

{% for f in app.get_all_fields %}
  <dt>{{f.label|capfirst}}</dt>
    <dd>
      {{f.value|escape|urlize|linebreaks}}
    </dd>
{% endfor %}
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2170228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档