在Django中自定义模板标签以过滤博客中的Featured_posts

时间:2018-08-14 17:36:56

标签: python django python-3.x django-templates django-template-filters

我从这篇文章中得到了提示 Customising tags in Django to filter posts in Post model

我已经创建了模板标签,但是我不确定如何在html中使用它。我有一个home.html,我想在其中显示三个特色文章。我正在寻找类似{%for features_post%}中的帖子,然后显示帖子的详细信息。

此外,我是否一定需要像上面的帖子中那样创建featured_posts.html,因为我不想为该帖子添加任何额外的页面。我只希望他们在其他内容上添加我的主页。

我想做的是像

一样创建了一个模板标签
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}

我在这里面临的问题是我无法从模型中导入Post模型。我的目录结构有点像这样: 我有一个名为posts的应用。 里面有models.py和templatetags模块,而在模板标签中有blog_tags.py

我无法进行相对导入。

然后创建新页面featured_posts.html,如下所示:-

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

现在,我想在home.html中使用它。如何使用?

编辑:-如上所述,我可以按以下方式加载模型:-

from posts.models import Post

1 个答案:

答案 0 :(得分:1)

home.html

{% load blog_tags %} 
{% featured_posts %}

调用您的标签。就是这样。

{% featured_posts count=15 %}

请注意,featured_posts不是上下文的帖子列表(在for循环中迭代),而是函数名称:def featured_posts(count=3)。它们在您的代码中具有相同的名称,可能使您感到困惑。