1

我有以下型号:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True, related_name='profile')
    starred_authors = models.ManyToManyField(Author, related_name='users_with_stars')

class Author(models.Model):
    name = models.CharField(max_length=250)
    slug = models.SlugField(unique=True)

然后在作者模板中,我想显示当前登录的用户是否已为该作者加注星标,但我在构建合适的查询以使用 ORM 获取此数据时遇到了麻烦。

在视图中,我曾考虑使用计数来注释作者对象,如果作者没有被加注星标,则计数为 0,如果加注星标则为 1。像这样的东西:

def author_detail(request, slug):
    user_id = request.user.pk
    author = Author.objects.filter(slug=slug).filter(users_with_stars__user__pk=user_id).annotate(fav=Count('users_with_stars'))[0]
    return render_to_response('app/author_detail.html',
                              { 'author': author},
                              context_instance=RequestContext(request)) 

但上述情况并不好,因为如果当前用户没有给作者加星标,则找不到对象。我想做的是以某种方式将最后一个过滤器放在注释中,但我无法让它工作。

理想情况下,我想在模板中执行以下操作:

{% if author.fav %}
    <p>This is one of your favorite authors</p>
{% endif %}

任何建议表示赞赏。

4

1 回答 1

4

我可能会将其拆分为模板字典中的一个单独属性,并通过直接检查该用户是否在为该作者加星标的用户列表中来计算它。

就像是:

[...]
author = Author.objects.filter(slug=slug)
is_fav = author.users_with_stars.filter(pk=user_id).exists()
return render_to_response('app/author_detail.html',
                          { 'author': author,
                            'is_fav': is_fav },
                          context_instance=RequestContext(request))

在模板中:

{% if is_fav %}
    <p>This is one of your favorite authors</p>
{% endif %}
于 2012-05-19T02:25:13.030 回答