我有以下几种模式:
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>结果是:只显示标签,而不显示主题。
我应该如何更改代码以使标签和主题都显示在实用列表中?
发布于 2013-09-26 19:38:43
您应该使用适当的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-26 19:07:36
你没有正确地过滤。
问题在getTopics方法中
试一试:
return TopicLabelConnection.objects.filter(labelId__id=self.id).order_by('order')注意,labelId是一个TopicLabel,而不是它的id
https://stackoverflow.com/questions/19036506
复制相似问题