在模板中显示多对多关系的名称

时间:2013-04-13 22:48:42

标签: django django-models django-templates portable-executable

我尝试在模板中显示模型中的字段名称。 这适用于除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)

我会感谢每一个有助于解决这个问题的提示。

此致 康拉德

2 个答案:

答案 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)

*我想,这是一种不同的类型;只是检查一下