简体   繁体   English

视图和模板中的Django模型关系

[英]Django model relationships in views and templates

I'm working on multi-user rss reader. 我正在使用多用户rss阅读器。 I want to limit display of posts only to those which are unread. 我想将帖子的显示仅限于未读的帖子。 I've managed to do this in my single "feed" view as below, but I can't figure out how to do the same in multiple feed aka "category" view. 我已经设法在下面的单个“提要”视图中做到了这一点,但是我不知道如何在多个提要又称为“类别”视图中做到这一点。

I've been trying something like here https://docs.djangoproject.com/en/1.5/topics/db/queries/#spanning-multi-valued-relationships but it didn't work for me 我一直在尝试类似这里的东西https://docs.djangoproject.com/en/1.5/topics/db/queries/#spanning-multi-valued-relationships,但是它对我没有用

Should I change my "category" view code or template code? 我应该更改“类别”视图代码还是模板代码? and if so how would you go about it? 如果是这样,您将如何处理?

thanks! 谢谢! -S -S

models 楷模

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)

views 意见

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)) 

templates 模板

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 %}

You can write custom template filter , ie: 您可以编写自定义模板过滤器 ,即:

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

(before you must pass read_post to category template context). (在必须将read_post传递到类别模板上下文之前)。

Try this queryset: 试试这个查询集:

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')

then in your template: 然后在您的模板中:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM