我尝试在模板中显示模型中的字段名称。 这适用于除ManyToManyField之外的任何类型的字段。
我在models.py中使用此函数返回所有字段。
def get_all_fields(self):
"""Returns a list of all field names on the instance."""
fields = []
# only display fields with values and skip some fields entirely
if f.editable and value and f.name not in ('id','lastname','firstname') :
fields.append(
{
'label':f.verbose_name,
'name':f.name,
'value':value,
})
return fields
在我的模板中,我使用此循环显示所有字段:
{% for f in modelname.get_all_fields %}
<td>{{f.label|capfirst}}</td><td>{{f.value|escape|urlize|linebreaks}}</td>
{% endfor %}
如前所述,除了ManyToManyFields之外,这适用于所有字段。 例如,我的一个M2M关系看起来像这样:
family = models.ManyToManyField('family', related_name="family", null=True, blank=True)
我会感谢每一个有助于解决这个问题的提示。
此致 康拉德
答案 0 :(得分:0)
尝试为ManytoManyfield指定verbose_name
参数
family = models.ManyToManyField('family',verbose_name=u'trampampam', related_name="family", null=True, blank=True)
答案 1 :(得分:0)
您编写{{f.value|escape|urlize|linebreaks}}
,显示该字段的值。但是,M2M关系的值是一组对象实例,您需要在该集合上再次迭代(如果这是您想要的结果):
{% load m2m_filter %}
{% for f in modelname.get_all_fields %}
<td>{{f.label|capfirst}}</td>
<td>
{% if f.value|is_m2m %}
{% for object in f.value.objects.all %}
{{ object|escape|urlize|linebreaks }}
{% endfor %}
{% else %}
{{f.value|escape|urlize|linebreaks}}
{% endif %}
</td>
{% endfor %}
您还必须创建filter
m2m_filter.py
from django import template
from django.db import models
register = template.Library()
def is_m2m(value):
return type(value) == models.ManyToManyField *
register.filter('is_m2m', is_m2m)
*我想,这是一种不同的类型;只是检查一下