【问题标题】:Field name and value in template模板中的字段名称和值
【发布时间】:2018-11-05 12:37:41
【问题描述】:

我想在我的模板中显示这样的内容:

姓名:约翰

年龄: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 个字段的模型,并且在模板中对字段进行硬编码会有点困难。

【问题讨论】:

  • 是的,有可能。

标签: python django django-templates


【解决方案1】:

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

【讨论】:

  • 为我工作,非常感谢!我不知道这个序列化程序。它们将使我的编码中的许多其他情况更容易。 T
  • 还有一个问题。有没有办法显示字段的verbose_name?我尝试输入 {{ field.verbose_name }} 但没有用。
  • 不,您不能这样做以在模板中显示它。将其发布为问题
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2011-07-18
    • 2011-01-06
    • 2013-01-07
    • 2011-03-10
    • 2019-02-02
    • 1970-01-01
    • 2019-10-27
    • 2019-02-21
    相关资源
    最近更新 更多