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

がある

  • トピック,
  • TopicLabels
  • それらの間の接続 ( TopicLabelConnection )。

1 つのラベルを複数のトピックに割り当てることができます。

次の構造の順序付きリストを表示したい:

  1. ラベル 1
    1. トピック 1
    2. トピック 2
    3. トピック 3
  2. ラベル 2
    1. トピック 4
    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

適切な 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フィールドを持つ唯一のモデルは TopicLabel であるため、呼び出しはgetTopics意味をなさないことに注意してくださいorder。ただし、順序フィールドを持たないトピックを取得しようとしています。

于 2013-09-26T19:38:43.277 に答える
1

適切にフィルタリングしていません。

問題は getTopics メソッドにあります

代わりにこれを試してください:

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

labelId は ID ではなく TopicLabel であることに注意してください

于 2013-09-26T19:07:36.313 に答える