Django模板:循环并打印对象的所有可用属性?

AP2*_*257 23 django django-templates

我有一个名为的数据库对象manor_stats,有大约30个字段.对于大多数行,这些字段中的大多数将为null.

在我的模板中,我想循环遍历行中的所有字段,并仅打印非空字段的信息.

例如,有一个名为"name"的字段:我只想<li>Name: {{ manor_stats.name }}</li>在模板中打印那些字段不为null的对象.理想情况下,我也想自动从某个地方提取"名字:",而不是指定它.

我知道我可以{% if manor_stats.name %}用来检查每个字段是否为空,但我不想为所有字段做30次.

这是我在views.py中的内容:

manor_stats = Manors.objects.get(idx=id)
return render_to_response('place.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

然后在place.html中,我希望有一些大致类似的东西(伪代码,用???表示我不知道怎么做的位):

{% if manor_stats %} 
<ul>
 {% for manor_stats.property??? in manor_stats %} 
  {% if manor_stats.property %} 
   <li>{{ manor_stats.property.field_name??? }} {{ manor_stats.property.value??? }}</li>
  {% endif %}
 {% endfor %
{% endif %}
Run Code Online (Sandbox Code Playgroud)

希望有道理......

buc*_*ley 50

您可以向Manors模型添加一个返回所有字段值的方法,然后您可以在模板中循环显示这些值,以查看该值是否为空.

- models.py

class Manors(models.Model)
  #field declarations

  def get_fields(self):
    return [(field.name, field.value_to_string(self)) for field in Manors._meta.fields]
Run Code Online (Sandbox Code Playgroud)

- manor_detail.html

{% for name, value in manor_stats.get_fields %}
  {% if value %}
    {{ name }} => {{ value }}
  {% endif %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)


Rob*_*son 7

下面的方法只需要定义一个自定义模板过滤器(请参阅文档) - 它比必须将方法编写或复制到您需要此功能的每个模型中更简单。

-- my_app/templatetags/my_tags.py

from django import template

register = template.Library()

@register.filter
def get_fields(obj):
    return [(field.name, field.value_to_string(obj)) for field in obj._meta.fields]
Run Code Online (Sandbox Code Playgroud)

您需要重新启动服务器才能注册新标签并在模板中可用。

-- my_app/templates/my_app/my_template.html

{% load my_tags %}
<ul>
{% for key, val in object|get_fields %}
  <li>{{ key }}: {{ val }}</li>
{% endfor %}
</ul>
Run Code Online (Sandbox Code Playgroud)

在 Django 1.11 中测试。

注意:由于 ._meta 是一个私有属性,它的功能在未来很可能会发生变化。

感谢这篇文章中的其他答案让我了解了大部分,尤其是 W. Perrin。