0

我有以下型号:

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

  • 话题
  • 主题标签
  • 它们之间的连接(TopicLabelConnection)。

一个标签可以分配给多个主题。

我想显示具有以下结构的有序列表:

  1. 标签 1
    1. 话题一
    2. 话题二
    3. 话题 3
  2. 标签 2
    1. 话题四
    2. 主题 5
    3. 话题 6

其中主题 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>

结果:只显示标签,而不显示它们的主题。

我应该如何更改代码以便标签和主题都显示在层次列表中?

4

2 回答 2

1

您没有正确过滤。

问题出在 getTopics 方法中

试试这个:

return TopicLabelConnection.objects.filter(labelId__id=self.id).order_by('order')

注意 labelId 是一个 TopicLabel,而不是它的 id

于 2013-09-26T19:07:36.313 回答
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,但您正在尝试获取没有 order 字段的主题。

于 2013-09-26T19:38:43.277 回答