在Django模板中显示ManyToMany字段

时间:2014-01-21 06:47:37

标签: django mezzanine

型号:

class Specialization(models.Model):
    SPECIALIZATION_TYPE = (
    ('S','Specialty'),
    ('Ss','Sub-specialty')
    )
    specialization_desc = models.CharField('Specialization',max_length=50,unique=True)
    specialization_type = models.CharField(max_length=2, choices=SPECIALIZATION_TYPE)
    active = models.BooleanField('Active',default=True)

    def __unicode__(self):
    return self.specialization_desc

class Person(models.Model):
    GENDER = (
    ('M','Male'),
    ('F','Female'),
    )
    first_name = models.CharField("First Name", max_length=50)
    last_name = models.CharField("Last Name",max_length=50)
    middle_name = models.CharField("Middle Name", max_length=50, blank=True)
    specialization_id = models.ManyToManyField(Specialization, 

模板:

{% for per in person_list%}
<tr>
<td>{{ per }}</td>
{% for spec in per.specialization_id.all %}
    <td>{{ spec }}</td>
{% endfor %}
</tr>
{% endfor %}

查看:

p = Person.objects.all()
return p

我希望看到这样一张桌子:

FullName | Specialization               |
My Name  | Programming, Web Development |

我得到了这个

FullName | Specialization |
My Name  | Programming    | Web Development
  • 根据我读过的文章,不可能将变量存储在变量中,仅此一项就可以解决我的问题
  • 从视图中存储数据在字典中给了我对象Person不可调用

对我来说似乎死路一条。想法?

1 个答案:

答案 0 :(得分:1)

我不明白你的问题。

您是否在模板中获得专业化并且只需要以不同方式显示它们?

{% for person in person_list%}
    <tr>
        <td>{{ person }}</td>
        <td>{{ person.specialization_id.all|join:", " }}</td>
    </tr>
{% endfor %}

此外,不要使用_id后缀外键和多对多关系。

对于外键Django已经为你做了,所以在DB中你最终会得到field_id_id

对于多对多表,会创建一个单独的表,并且不会在数据库中的任何位置创建specialization_id。请使用更详细的名称,例如specializations