我有以下模特:
class Topic(models.Model):
title = models.CharField(max_length=140)
def __unicode__(self):
return self.title
class Meta:
verbose_name = _('topic')
verbose_name_plural = _('topics')
class TopicLabel(models.Model):
name = models.CharField(max_length=256)
order = models.IntegerField(null=True, blank=True)
def getTopics():
return TopicLabelConnection.objects.filter(labelId=self.id).orderby('order')
def __unicode__(self):
return self.name
class TopicLabelConnection(models.Model):
topicId = models.ForeignKey(Topic, related_name='connection_topic')
labelId = models.ForeignKey(TopicLabel, related_name='connection_label')
def __unicode__(self):
return self.labelId.name + ' / ' + self.topicId.title
有
可以为多个主题分配一个标签。
我想显示一个具有以下结构的有序列表:
其中主题1,2和分配给标签1和主题4,5和6 - 标记为2.
为此,我创建了如下所示的视图功能和HTML模板片段。
查看功能
def home(request):
labels = TopicLabel.objects.filter(connection_label__isnull=False).distinct().order_by('order')
return TemplateResponse(request, 'home.tpl.html', locals())
模板片段
<ol>
{% for cur_label in labels %}
<li>{{ cur_label.name }}</li>
<ol>
{% for cur_topic_label_connection in cur_label.getTopics %}
<li>{{ cur_topic_label_connection.topicId.title }}</li>
{% endfor %}
</ol>
{% endfor %}
</ol>
结果:仅显示标签,但不显示主题。
我应该如何更改代码,以便标签和主题都显示在层次结构列表中?
答案 0 :(得分:1)
您没有正确过滤。
问题在于getTopics方法
请改为尝试:
return TopicLabelConnection.objects.filter(labelId__id=self.id).order_by('order')
注意labelId是一个TopicLabel,而不是它的id
答案 1 :(得分:1)
您应该使用正确的ManyToMany字段:
class TopicLabel(models.Model):
...
topics = models.ManyToManyField(Topic, through=TopicLabelConnection)
现在可以移除getTopics
方法,您可以在模板中执行此操作:
{% for topic in cur_label.topics.all %}
<li>{{ topic.title }}</li>
{% endfor %}
请注意,order_by
中的getTopics
电话无意义,因为唯一具有order
字段的模型是TopicLabel,但您正在尝试获取无主题的主题订单领域。