如何在django中制作两组相关对象的字典?

时间:2015-02-21 04:15:24

标签: django django-queryset

在制作一个简单的论坛时,我想制作一个主题词典以及他们的作者(OP用户)发送到包含主题列表的模板。

以下是模型:

class Topic(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField(max_length=10000, null=True)
    forum = models.ForeignKey(Forum)
    created = models.DateTimeField()
    creator = models.ForeignKey(User, blank=True, null=True)
    updated = models.DateTimeField(auto_now=True)
    closed = models.BooleanField(blank=True, default=False)
    visits = models.IntegerField(default = 0)

    def num_posts(self):
        return self.post_set.count()

    def num_replies(self):
        return max(0, self.post_set.count() - 1)

    def last_post(self):
        if self.post_set.count():
            return self.post_set.order_by("created")[0]

    def __unicode__(self):
        return unicode(self.creator) + " - " + self.title

我不确定如何(以及在​​哪里)创建字典。我尝试在这样的视图中制作dict:

def forum(request, forum_id):
    args = {}
    topics = Topic.objects.filter(forum=forum_id).order_by("-created")
    ops = {}
    for t in topics:
        ops[t] = User.objects.get(id = t.creator)
...

然而,这会导致此错误:

int() argument must be a string or a number, not 'User'

我是django的初学者并且在这里有股票,所以感谢你的提示。

1 个答案:

答案 0 :(得分:2)

t.creator已经是User对象,因此您可以将其指定为:

ops[t] = t.creator

构建dicts的pythonic方法是向dict构造函数传递两项元组的列表:

ops = dict((t.title, t.creator) for t in topics)

但无论如何,你不需要字符串的字典来迭代模板。按原样传递queryset:

def forum(request, forum_id):
    topics = Topic.objects.select_related('creator') \
                          .filter(forum=forum_id).order_by("-created")    
    return render(request, 'forum.html', {'topics': topics})

forum.html

<ul>
{% for topic in topics %}
    <li>{{ topic.title }} by {{ topic.creator }}</li>
{% endfor %}
</ul>
相关问题