1. 程式人生 > >網站搭建 (第05天) 分類和歸檔

網站搭建 (第05天) 分類和歸檔

歸檔 eat 得到 發現 obj 自定義 () append def

一、分類

  在blog/views.py中定義一個博客分類的視圖函數:

def category_list(request):
    """
        作用:博客分類的視圖處理
        request:請求對象
    """
    # 獲得所有的分類
    category_list = Category.objects.all()

    context = {‘category_list‘: category_list}
    return render(request, ‘blog/category_list.html‘, context)

  通過該視圖函數,可以發現其向模板發送了category_list,也就是所有分類的列表,但是並沒有對該分類下的文章進行數量計算,有兩種方法可以通過category對象得到其對應的文章數量。

  方法一:

# 獲取博客分類對應的博客數量
# 通過對每個category綁定一個post_count屬性
category_list = []
for category in category_list:
    category.post_count = Post.objects.filter(category=category).count()
    category_list.append(category)

  方法二:使用模板標簽,簡單使用方法如:Django入門: (第十二天) 自定義過濾器和標簽

  在templatetags文件夾中創建一個post_tags.py文件。

from django import template
from blog.models import Post

register = template.Library()


@register.simple_tag
def get_category_post(category):
    """
        作用:獲取該目錄下的所有博客
        obj:模板傳遞的參數,也就是category
    """
    post_list = Post.objects.filter(category=category)
    return post_list[0:15]


@register.simple_tag
def get_category_count(category):
    """
        作用:計算當前分類的文章數量,並返回到模板中
        category:模板頁面傳入的category
    """
    return Post.objects.filter(category=category).count()

  前端代碼實現

{% load post_tags %}
...
{% for category in category_list %}
    {% get_category_post category as post_list %}
    <div class="col-sm-4">
        <div class="category">

            <h4>
                <a href="{% url ‘blog:category‘ category.pk %}">
                    <span class="glyphicon glyphicon-file"></span>  {{ category }} ({% get_category_count category %})
                </a>
            </h4>

            <div>
                {% for post in post_list %}
                    <div class="light-blog"><a href="{% url ‘blog:detail‘ post.id %}">{{ post }}</a></div>
                {% empty %}
                    <h5>暫無博客</h5>
                {% endfor %}
            </div>

        </div>
    </div>
{% empty %}
    <h3>暫無分類!</h3>
{% endfor %}

二、歸檔

  在blog/views.py中定義一個日期歸檔的視圖函數。

def date_list(request):
    """
        作用:日期歸檔的視圖處理
        request:請求對象
    """
    date_list = Post.objects.dates(‘created_time‘, ‘month‘, order=‘DESC‘)
    post_count = Post.objects.all().count()

    context = {‘date_list‘: date_list,
               ‘post_count‘: post_count,}
    return render(request, ‘blog/date_list.html‘, context)

  同樣的,日期歸檔也與上述非常相似,但是不能采用類似於方法一的解決方案,因為並沒有設計關於日期的數據表,無法給日期直接綁定一個字段名,可是其也有兩種方法,即使用字典或模板標簽。

  方法一:

# 獲取日期歸檔對應的博客數量
# 利用字典
post_date_dict = {}
for post_date in date_list:
    post_date_count = Post.objects.filter(created_time__year=post_date.year, created_time__month=post_date.month).count()
    post_date_dict[post_date] = post_date_count

  方法二:加入模板標簽,在post_tags.py文件添上

@register.simple_tag
def get_date_post(year, month):
    """
        作用:獲取該年月下的博客
        year:模板傳遞的年份
        month:模板傳遞的月份
    """
    post_list = Post.objects.all().filter(created_time__year=year, created_time__month=month)
    return post_list[:15]

@register.simple_tag
def get_date_to_month(post_date):
    """
        作用:將日期格式轉換成年月的形式
        obj: 對應的post_date
    """
    return (str(post_date.year) +‘年‘ + str(post_date.month) + ‘月‘)

@register.simple_tag
def get_date_count(year, month):
    """
        作用:獲得該年月下的博客數量
        year: 模板傳遞的年份
        month:模板傳遞的月份 
    """
    return Post.objects.filter(created_time__year=year, created_time__month=month).count()

  ?前端代碼實現

{% for post_date in date_list %}
    {% get_date_post post_date.year post_date.month as post_list %}

    <div class="col-xs-12 col-sm-4">
        <div class="category">
            <h4>
                <a href="{% url ‘blog:date‘ post_date.year post_date.month %}" style="color: #333; font-weight: bold" >
                    <span class="glyphicon glyphicon-book"></span>  {% get_date_to_month post_date %} ({% get_date_count post_date.year post_date.month %})
                </a>
            </h4>

            <div>
                {% for post in post_list %}
                    <div class="light-blog">
                        <a href="{% url ‘blog:detail‘ post.id %}">{{ post }}</a>
                    </div>
                {% empty %}
                    <h5>暫無博客</h5>
                {% endfor %}
        </div>
    </div>
</div>
{% empty %}
    <h3>暫無分類!</h3>
{% endfor %}

  原文出處:https://jzfblog.com/detail/49,文章的更新編輯以此鏈接為準。歡迎關註源站文章!

網站搭建 (第05天) 分類和歸檔