博客的最新文章、归档、分类

因为这些模块都是动态变化的,使用Django的自定义模板标签实现页面侧边栏。

    在app下新建一个templatetags目录(目录里必须要有__init__.py文件),新建一个py文件(blog_tags.py)用来写自定义的标签,定义一套标签,只要在前端调用这些标签就可以实现相应的功能。

最新文章:

    在blog_tags.py文件中的开头要写:

        from django import template

        register = template.library()

    在想要变成自定义标签(tag)的函数上面加上@register.simple_tag,比如:

        from .models import Post

        @register.simple_tag

        def get_recent_posts(num=5):

            return Post.objects.all().order_by('-created_time')[:num]

    在前端模板中使用自定义标签:

        在模板中导入自定义标签文件:{% load blog_tags %}

        在要显示标签的的位置:

            <ul>

                {% get_recent_posts as post_list %}

                {% for post in post_list %}

                    <li>

                        <a href="{% url 'blog:post_detail' post.id %}">{{ post.title }}</a>

                    </il>

                  {% empty %}

                      暂无文章

                  {% endfor %}

              </ul>

        ------------------------------------------------------------------------------------------------------------------------------------------

归档:

    # 归档模板标签

    @register.simple_tag

    def rachives():

        #  'created_time'按创建时间字段, 'month'按月归档, order='DESC'逆序

        return Post.objects.dates('created_time', 'month', order='DESC') 

在前端的模板中使用自定义归档标签:

            <ul>

                {% archives as post_dates %}

                {% for date in post_dates %}

                    <li>

                        <a href="{% url 'blog:archives' date.year date.month %}">{{ date.year }}年{{ date.month}}月</a>

                    </il>

                  {% empty %}

                      暂无归档

                  {% endfor %}

              </ul>

url:

    url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', archives, name='archives'),

views:

    # 归档

  def archives(request, year, month):

      post_list = Post.objects.filter(create_time__year=year, create_time__month=month ).order_by('-create_time')

      return render(request, 'blog/index.html', {'post_list': post_list})

注意mysql无法使用月份过滤问题

---------------------------------------------------------------------------------------------------------------------------------------

分类:

    # 分类模板标签

    from .models import Category

    @register.simple_tag

    def get_categories():

        return Category.objects.annotate(num_posts=Count('post').filter(num_posts__gt=0)

在前端模板中使用自定义分类标签:

            <ul>

                {% get_categores as categories %}

                {% for category in categoies %}

                    <li>

                        <a href="{% url 'blog:category' category.id %}">{{ category.name}}<span class="post-count">

                       {{category.num_posts}}</span>

                          </a>

                    </il>

                  {% empty %}

                      暂无分类

                  {% endfor %}

              </ul>

url:

    url(r'^category/(?P<id>\d+)/$', category, name='category'),

views:

    def category(request, id):

        post_list = Post.objects.filter(category_id=id).order_by('-created_time')

        return render (request, 'blog/index.html', {'post_list':post_list})

 

    

猜你喜欢

转载自blog.csdn.net/yx1179109710/article/details/81413814
今日推荐