0

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

尝试指定verbose_name论据ManytoManyfield

family = models.ManyToManyField('family',verbose_name=u'trampampam', related_name="family", null=True, blank=True) 
+0

什么都没有发生。 – Conrad

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) 

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

+0

我尝试使用过滤器时出现错误。 无效的过滤器:'is_m2m' – Conrad

+0

更具体地说,我尝试检查是否存在不同的字段。 '%如果f.label == 'berufsschule' %}​​{{f.label | capfirst}}​​{{f.value|escape|urlize|linebreaks}} {%其他%}​​{{f.label | capfirst}}​​{{f.value | escape | urlize | linebreaks}}' – Conrad

+0

这不适用于M2M字段。 – Conrad