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