模板中的字段名称和值

时间:2018-11-05 12:37:42

标签: python django django-templates

我想在我的模板中显示以下内容:

  

姓名:约翰

     

年龄:18

     

城市:纽约

例如,使用以下代码:

views.py

def person_details(request,pk):
   person = get_object_or_404(Person, id=pk)
   return render(request, 'template.html', {'person': person, 'person_fields': person._meta.get_fields()})

template.html

{% for field in person_fields %}        
     <div class="col-4 form-group">            
         <p><strong>{{ field.verbose_name }}:</strong> {{ person[ field.name ]  }}</p>             
     </div>
{% endfor %}

这在python中可能吗?我问是因为我有一个大约有20个字段的模型,而对模板中的字段进行硬编码会有点困难。

2 个答案:

答案 0 :(得分:2)

您可以使用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'))

答案 1 :(得分:0)

故意故意限制Django模板,因此很难编写业务逻辑(或几乎不可能)。通常在模型或视图层执行这种逻辑。

def person_details(request, pk):
    person = get_object_or_404(Person, id=pk)
    person_data = {
       f.verbose_name: getattr(person, f.name, None)
       for f in person._meta.get_fields()
    }
    return render(request, 'template.html', {'person': person, 'person_data': person_data })

,然后使用:

{% for ky, val in person_data.items %}
     <div class="col-4 form-group">            
         <p><strong>{{ ky }}:</strong> {{ val }}</p>             
     </div>
{% endfor %}

但是,建议不要自己进行序列化,而要使用其他these listed in this answer之类的序列化方法。