Search code examples
pythondjangopython-3.xdjango-templatesdjango-template-filters

Customize template tags in Django to filter featured_posts in a blog


I have taken a hint from this post Customising tags in Django to filter posts in Post model

I have created the template tag but I am not sure how to use it in my html. I have a home.html where I want to show three featured post. I am looking for something like {% for post in featured_post %} and then show the post detail.

Also, do I necessarily need to create a featured_posts.html as in the above post because I don't want any extra page for the featured post. I just want them to add on my home page in addition to other stuff.

What I am trying to do is I have created a template tag as under

from django import template


register = template.Library()


@register.inclusion_tag('featured_posts.html')
def featured_posts(count=3):
    if Post.is_featured:
        featured_posts = Post.published.order_by('-publish')[:count]

    return {'featured_posts': featured_posts}

The problem I am facing here is I can't import the Post model from model. My directory structure is somewhat like this:- I have an app named posts. Inside that I have models.py and templatetags module and inside the template tag I have blog_tags.py

I couldn't do the relative import.

And then created a new page featured_posts.html as under:-

<ul>
    {% for post in featured_posts %}
        <li>{{ post.title }} </li>
    {% endfor %}
</ul>

Now, I want to use it in my home.html. How can I use it?

Edit:- As mentioned above I could load the models as under:-

from posts.models import Post

Solution

  • home.html

    {% load blog_tags %} 
    {% featured_posts %}
    

    Call your tag. That's it.

    or

    {% featured_posts count=15 %}
    

    Note, featured_posts here is not the post list (which is iterated in for loop) from context but function name: def featured_posts(count=3). They have the same name in your code and probably this has confused you a little.