在Django中自定义标签以过滤帖子模型

时间:2017-06-03 16:27:11

标签: python django django-templates django-taggit

快速提问 - 我不确定处理此问题的正确方法是什么。基本上我希望定义一个自定义标签,它处理一些逻辑然后返回模型Post的所有帖子,其中is_featured字段设置为True。我已经尝试了很多途径来实现这个目标,但没有一个有效。我的最后一个coherant"猜测"如下:

templatetags / blog_tags.py:

@register.inclusion_tag('blog/post/featured_posts.html')
def show_featured_posts(count=4):
    """Return 4 of the most recent posts (of model: 'Post') that has the variable is_featured set to True."""
    if Post.is_featured:
        featured_posts = Post.published.order_by('-publish')[:count]

return { 'featured_posts': featured_posts}

models.py(有用位):

class PublishedManager(models.Manager):

    def get_queryset(self):
        return super(PublishedManager, self).get_queryset().filter(status='published')

class Post(models.Model):

    STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
    )

    POST_TYPES = (
        ('news', 'News'),
        ('feature', 'Feature'),
        ('review', 'Review'),
    )

    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique_for_date='publish')

    author = models.ForeignKey(UserProfile, related_name='blog_posts')

    body = models.TextField()
    lead_in = models.CharField(max_length=500, default='')

    #These next items shall contain our development information for game reviews - this is much like the lead_in:
    platform = models.CharField(max_length=1000, default='')
    publisher = models.CharField(max_length=1000, default='')
    developer = models.CharField(max_length=1000, default='')
    release = models.DateTimeField(default=timezone.now)
    is_featured = models.BooleanField(default=False)

    #Out blog layout dictates each featurette has up to three scrolling images associated to it:
    image_scroll_1 = models.ImageField(storage=site_media_upload_location, null=True, blank=True)
    image_scroll_2 = models.ImageField(storage=site_media_upload_location, null=True, blank=True)
    image_scroll_3 = models.ImageField(storage=site_media_upload_location, null=True, blank=True)

    type = models.CharField(max_length=10,choices=POST_TYPES,default='review')

    publish = models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10,choices=STATUS_CHOICES,default='draft')
    rating = models.PositiveSmallIntegerField(default=10)

    wrap_header = models.CharField(max_length=250, default='')
    wrap_up = models.TextField(default='')
    disclaimer = models.TextField(default='')

    objects = models.Manager()
    published = PublishedManager()
    tags = TaggableManager()

    class Meta:
        ordering = ('-publish',)

    def __str__(self):
        """Return the state title of the post"""
        return self.title

    def get_absolute_url(self):
        """Get absolute_url path specific to this post."""
        return reverse('blog:post_detail', args = [self.publish.year, self.publish.strftime('%m'), self.publish.strftime('%d'), self.slug])

    def get_image(self):
        """Get upload_to path specific to this photo."""
        return self.image.url

这就是我认为我需要包含的所有内容 - 我已准备好featured_posts.html模板,所以我不认为问题在于此。它完全在blog_tags.py文件中。

1 个答案:

答案 0 :(得分:0)

替换blog_tags.py中的以下代码

 if Post.is_featured:
        featured_posts = Post.published.order_by('-publish')[:count]

featured_posts = Post.published.filter(is_featured=True).order_by('-publish')[:count]