2014-01-18 4 views
0

Я работаю над многопользовательским rss-ридером. Я хочу ограничить отображение сообщений только теми, которые не прочитаны. Мне удалось сделать это в моем единственном представлении «feed», как показано ниже, но я не могу понять, как сделать то же самое в нескольких каналах aka «категория».отношения модели 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

Я не был знаком с настраиваемыми фильтрами. Я не уверен, как его реализовать сейчас? Должен ли я помещать его здесь: {% для фида в user_category.userfeed_set.all | непрочитанный%} или здесь {% для сообщения в feed.feed.post_set.all | непрочитанный%} ?? также мне следует добавить некоторые дополнительные аргументы, такие как непрочитанные: сообщения? Я пытаюсь использовать все эти параметры, но, похоже, не работает :( – sikor

+1

Вы должны применить этот фильтр к сообщению «Задать запрос» и дополнительно пропустить чтение пользователями сообщений. Поэтому в этом примере это может быть примерно так: '{% for post в feed.feed.post_set.all | непрочитанные: read_posts%} '. –

+0

После того, как последующая настройка работала как шарм! Dzieki :) – sikor

0

Попробуйте 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') 

затем в шаблоне:

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

Я пробовал, но это не исключало прочитанные сообщения (те, которые хранятся в модели ReadPost. У вас была бы другая идея? – sikor

Смежные вопросы