2014-09-19 62 views
0

这是我的models.py:确定对象是否在一组模型中的外键?

class Blog(models.Model): 
    user = models.ForeignKey(User) 
    actualBlog = models.CharField(max_length=200) 

class BlogComments(models.Model): 
    user = models.ForeignKey(User) 
    blog = models.ForeignKey(Blog) 
    actualBlog = models.CharField(max_length=200) 

我通过了所有现有的博客列表,以我的模板。在我的模板中,我想查看request.user是否在评论博客的用户列表中。类似这样的:

{% for blog in allExistingBlogs %} 
    {% if request.user in blog.blogcomments_set.all %} 
     <p>you have already commented on this blog</p> 
    {% else %} 
     <p>you have not commented on this blog yet</p> 
    {% endif %} 
{% endfor %} 

但这并不起作用。我也试过

{% if request.user in blog.blogcomments_set.all.user %} 

但这也行不通。任何想法如何让它的工作?

+0

您是否尝试过使用模板标记? – karthikr 2014-09-19 17:13:38

回答

2

装饰物体在你看来,你把它发送到您的模板之前:现在

def show_blogs(request): 
    all_blogs = Blog.objects.all() 
    blogs = [] 
    for blog in all_blogs: 
     blogs.append((blog, blog.blogcomments_set.all(), 
          blog.blogcomments_set.filter(user=request.user).count())) 
    return render(request, 'blogs.html', {'blogs': blogs}) 

,在你的模板:

{% for blog, comments, commented in blogs %} 
    {{ blog }} - {{ comments.count }} 
    {% if commented %} 
     You have already commented! 
    {% else %} 
     Would you like to comment? 
    {% endif %} 
{% endfor %} 
+0

很好的答案。顺便说一句,为什么您在'blog.blogcomments_set.filter(user = request.user).count()'的末尾添加.count()?因为使用.count(),那么{%if commentmented%}将始终返回true,因为空列表仍然存在。因此,我删除了.count,以便如果用户尚未评论,则{%if commentmented%}现在将返回false。 – user2719875 2014-09-19 20:28:35

+1

@ user2719875 count()返回一个整数,如果没有评论,则返回0,所以'{%if commented%}'评估为False。该文档建议使用['exists()'](https://docs.djangoproject.com/en/1.4/ref/models/querysets/#django.db.models.query.QuerySet.exists)而不是布尔值评估一个查询集,如果这就是你所需要的,因为它更高效(但不是很多)。 – 2014-09-19 22:03:43

1

可以在Blog使用模型方法:

def _get_commenters(self): 
    commenters = self.blogcomments_set.values_list(user, flat=True) 
    return commenters 
commenters = property(_get_commenters) 

然后你只需要使用模板:

{% if request.user in blog.commenters %} 
相关问题