2014-01-18 50 views
0

我正在研究多用户rss阅读器。我想限制帖子的显示只限于未读的帖子。我已经设法在我的单个“feed”视图中做到这一点,但我无法弄清楚如何在多个feed中也做同样的“category”视图。视图和模板中的Django模型关系

我一直在试图像这里https://docs.djangoproject.com/en/1.5/topics/db/queries/#spanning-multi-valued-relationships但对我来说

我应该改变我的“类别”视图或代码模板代码没有奏效?如果是的话,你会怎么做呢?

谢谢! -S

车型

class UserCategory(models.Model): 
    name = models.CharField(unique=False, max_length=64) 
    user = models.ForeignKey(User) 
    slug = AutoSlugField(populate_from='name', always_update='True', unique_with='user') 

class Feed(models.Model): 
    feed_url = models.URLField(unique=True) 
    default_title = models.CharField(max_length=64, blank=True) 
    link = models.URLField(blank=True) 

class UserFeed(models.Model): 
    feed = models.ForeignKey(Feed) 
    title = models.CharField(max_length=64) 
    category = models.ForeignKey(UserCategory) 
    user = models.ForeignKey(User) 
    slug = AutoSlugField(populate_from='title', always_update='True', unique_with='user') 

class Post(models.Model): 
    feed = models.ForeignKey(Feed) 
    title = models.CharField(max_length=256) 
    content = models.TextField() 
    link = models.URLField(max_length=512) 

class ReadPost(models.Model): 
    user = models.ForeignKey(User) 
    post = models.ForeignKey(Post) 

意见

def feed(request, user_feed_slug): 
    user_feed = get_object_or_404(UserFeed.objects.filter(slug=user_feed_slug, user=request.user)) 
    read_post = ReadPost.objects.filter(user=request.user).values_list('post') 
    posts = Post.objects.select_related().filter(feed=user_feed.feed).exclude(id__in=read_post) 

def category(request, user_category_slug): 
    user_category = get_object_or_404(UserCategory.objects.filter(slug=user_category_slug, user=request.user)) 

模板

feed 
    {% for post in posts %} 
     {{ post.title }}      
    {% endfor %} 

category 
{% for feed in user_category.userfeed_set.all %} 
    {{ feed.title }} 
    {% for post in feed.feed.post_set.all %} 
     {{ post.title }} 
     {{ post.content }} 
    {% endfor %} 
{% endfor %} 

回答

1

你可以写custom template filter,即:

@register.filter 
def unread(posts, read_posts): 
    return posts.exclude(id__in=read_posts) 

(在您必须将read_post传递到类别模板上下文之前)。

+0

我不熟悉自定义过滤器。我不确定如何正确地实现它?我应该把它放在这里:{%for feed in user_category.userfeed_set.all | unread%}或这里{%for feed in feed.feed.post_set.all | unread%} ??还应该加上一些额外的参数,如未读:帖子?我正在尝试所有这些选项,但它似乎没有工作:( – sikor

+1

您必须将此过滤器应用于发布queryset并另外传递用户阅读帖子。因此,在此示例中,它可能是这样的:'{%for post在feed.feed.post_set.all | unread:read_posts%}'。 –

+0

经过进一步调整就像一个魅力!Dzieki :) – sikor

0

试试这个查询集:

def category(request, user_category_slug): 
    user_category = get_object_or_404(UserCategory, slug=user_category_slug, 
              user=request.user)) 

    feeds = UserFeed.objects.filter(category__slug=user_category_slug, user=request.user)\ 
       .prefetch_related('feed__post_set') 

然后在你的模板:

{% for feed in feeds %} 
    {{ feed.title }} 
    {% for post in feed.feed.post_set.all %} 
     {{ post.title }} 
     {{ post.content }} 
    {% endfor %} 
{% endfor %} 
+0

我试过了,但是这并没有排除那些被读取的文章(那些存储在ReadPost模型中的文件,你会有其他想法吗? – sikor