猿问

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

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

我正在尝试创建一个基本模板来显示所选实例的字段值及其名称。可以将其视为表格格式中该实例值的标准输出,其中第一列中的字段名称(特别是如果在字段上指定了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批准”的方式来做到这一点?这似乎是一项非常常见的任务,我需要经常为这个特定的项目做这件事。


一只甜甜圈
浏览 803回答 3
3回答

狐的传说

您可以使用Django的to-python&nbsp;queryset序列化程序。只需在您的视图中输入以下代码:from&nbsp;django.core&nbsp;import&nbsp;serializers data&nbsp;=&nbsp;serializers.serialize(&nbsp;"python",&nbsp;SomeModel.objects.all()&nbsp;)然后在模板中:{%&nbsp;for&nbsp;instance&nbsp;in&nbsp;data&nbsp;%} &nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;for&nbsp;field,&nbsp;value&nbsp;in&nbsp;instance.fields.items&nbsp;%} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{&nbsp;field&nbsp;}}:&nbsp;{{&nbsp;value&nbsp;}} &nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;endfor&nbsp;%}{%&nbsp;endfor&nbsp;%}它的巨大优势在于它处理关系字段。对于字段子集,请尝试:data&nbsp;=&nbsp;serializers.serialize('python',&nbsp;SomeModel.objects.all(),&nbsp;fields=('name','size'))

千万里不及你

最后在dev邮件列表上找到了一个很好的解决方案:在视图中添加:from&nbsp;django.forms.models&nbsp;import&nbsp;model_to_dictdef&nbsp;show(request,&nbsp;object_id): &nbsp;&nbsp;&nbsp;&nbsp;object&nbsp;=&nbsp;FooForm(data=model_to_dict(Foo.objects.get(pk=object_id))) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;render_to_response('foo/foo_detail.html',&nbsp;{'object':&nbsp;object})在模板中添加:{%&nbsp;for&nbsp;field&nbsp;in&nbsp;object&nbsp;%} &nbsp;&nbsp;&nbsp;&nbsp;<li><b>{{&nbsp;field.label&nbsp;}}:</b>&nbsp;{{&nbsp;field.data&nbsp;}}</li>{%&nbsp;endfor&nbsp;%}
随时随地看视频慕课网APP
我要回答