Django 快速搭建博客 第八節

距離上一節已經過去了一兩天了,上一節我們學到了markdown高亮文章詳情頁,這次學習使用自定義模板標簽,把右邊的最新,歸檔,分類給寫一下

1 自定義模板標簽

1, 博客右邊有最新文章,歸檔,分類和標簽云,這四項內容在每個頁面,不管是首頁還是文章詳情頁都會進行顯示,so,我們統一一下一套模板標簽進行數據的顯示

類似于一開始的模板標簽{% static %} 這個就是模板標簽,我們自定義的模板標簽需要遵循Django的規范,以下是步驟:

1, 在blog應用下新建一個templatetags包,注意以下包是有init.py文件的,然后再在templatetags目錄下創建一個blog_tags.py文件,這個文件存放自定義模板的代碼

snakeson@snakeson-Inspiron-5421:~/developer/django/djangoblog/blogproject/blog$ tree
.
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│   ├── 0001_initial.py
│   ├── __init__.py
│   └── __pycache__
│       ├── 0001_initial.cpython-35.pyc
│       └── __init__.cpython-35.pyc
├── models.py
├── __pycache__
│   ├── admin.cpython-35.pyc
│   ├── __init__.cpython-35.pyc
│   ├── models.cpython-35.pyc
│   ├── urls.cpython-35.pyc
│   └── views.cpython-35.pyc
├── static
│   └── blog
│       ├── css
│       │   ├── bootstrap.min.css
│       │   ├── custom.css
│       │   ├── highlights
│       │   │   ├── autumn.css
│       │   │   ├── borland.css
│       │   │   ├── bw.css
│       │   │   ├── colorful.css
│       │   │   ├── default.css
│       │   │   ├── emacs.css
│       │   │   ├── friendly.css
│       │   │   ├── fruity.css
│       │   │   ├── github.css
│       │   │   ├── manni.css
│       │   │   ├── monokai.css
│       │   │   ├── murphy.css
│       │   │   ├── native.css
│       │   │   ├── pastie.css
│       │   │   ├── perldoc.css
│       │   │   ├── tango.css
│       │   │   ├── trac.css
│       │   │   ├── vim.css
│       │   │   ├── vs.css
│       │   │   └── zenburn.css
│       │   └── pace.css
│       └── js
│           ├── bootstrap.min.js
│           ├── jquery-2.1.3.min.js
│           ├── modernizr.custom.js
│           ├── pace.min.js
│           └── script.js
├── templatetags
│   ├── blog_tags.py
│   ├── __init__.py
│   └── __pycache__
│       ├── blog_tags.cpython-35.pyc
│       └── __init__.cpython-35.pyc
├── tests.py
├── urls.py
└── views.py

這時候顯示的應該是上面的tree結構

2 ,下面我們開始編寫模板代碼:

/blog/templatetags/blog_tags.py


from django import template
from ..models import Post,Category


# 注冊模板
register = template.Library()

#1. 最新模板:查找最新的五條文章(裝飾)
@register.simple_tag
def get_recent_posts(num=5):
    return Post.objects.all().order_by('-created_time')[:num]

#2. 歸檔模板:精確到月份降序排序
@register.simple_tag
def archives():
    return Post.objects.all().dates('created_time','month',order='DESC')

#3. 分類模板
@register.simple_tag
def get_categories():
    return Category.objects.all()

導入template這個模塊,實例化template.Library類,并裝飾三個方法,這樣,我們就可以在模板中使用語法{% get_recent_posts %}這樣子的語法了。 simple_tag是在1.9之后才會生效的。

3, 打開base.html

{% load staticfiles %}
{% load blog_tags %}
<!DOCTYPE html>
<html>
<head>
    <title>Black &amp; White</title>

    <!-- meta -->
    <meta charset="UTF-8">

加入{% load blog_tags %}

4,然后找到base.html里面的最新文章,歸檔,分類,把里面的內容更新一下:

 <div class="widget widget-recent-posts">
                    <h3 class="widget-title">最新文章</h3>

                    {% get_recent_posts as recent_post_list %}
                    <ul>
                        {% for post in recent_post_list %}
                        <li>
                            <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
                        </li>
                        {% empty %}
                          暫無文章
                        {% endfor %}
                    </ul>
                </div>
                <div class="widget widget-archives">
                    <h3 class="widget-title">歸檔</h3>
                    {% archives as date_list %}
                    <ul>
                        {% for date in date_list %}
                        <li>
                            <a href="{% url 'blog:archives' date.year date.month %}">
                                {{ date.year }} 年 {{ date.month }} 月
                            </a>
                        </li>
                        {% empty %}
                        暫無歸檔
                        {% endfor %}
                    </ul>
                </div>

                <div class="widget widget-category">
                    <h3 class="widget-title">分類</h3>
                    {% get_categories as category_list %}
                    <ul>
                        {% for category in category_list %}
                        <li>
                            <a href="{% url 'blog:category' category.pk %}">
                                {{ category.name }} <span class="post-count">(13)</span>
                            </a>
                        </li>
                        {% empty %}
                        暫無分類!
                        {% endfor %}
                    </ul>
                </div>

這樣子就把我們博客右邊的內容更新完了, 不過這時候是不可以進行點擊跳轉鏈接的,上面的代碼可以暫時把<a標簽下的href的點擊事件給去掉。(注意:確保模板標簽的語法使用正確,即 {% load blog_tags %},注意 { 和 % 以及 % 和 } 之間沒有任何空格)


2 歸檔,分類點擊事件的完整,頁面的完善

(1), 歸檔

1 博客主頁顯示了全部的文章,使用的函數是Post.objects.all()來獲取全部文章,但是歸檔里面是獲取某個月份的文章,當然你也可以獲取某日下的文章,因為你可能一天發布好幾篇文章, 我們這里使用一個新的函數filter來過濾掉
1.1 寫blog/views.py 視圖:

# 歸檔視圖
def archives(request,year,month):
    post_list = Post.objects.filter(created_time__year=year,
                                    created_time__month=month
                                    ).order_by('-created_time')
    return render(request,'blog/index.html',context={'post_list':post_list})

提醒一下,一定要是created_time_year 前面一根線,后面兩根線,不然有的是時間找bug,第一次,第二次寫的時候,我都呵呵了,說粗心也不是,不過總算是能記住這里了,這里我們按照降序的時間進行歸檔排序,傳入的year和month 是因為我們要根據xx年xx月進行歸檔

1.2 配置blog/urls.py 規則

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

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

這里的(?P)代表捕獲一組,因為傳的是year,year四位數,后面傳的是month

1.3 修改base.html
我們找到歸檔

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

這里使用的href雙引號的是屬于不是硬編碼的那種,意思是對應的url為blog下的archives的函數,然后傳入的參數是date.year和date.month
具體來說,就是根據created_timeyearmonth屬性過濾,篩選出文章發表在對應的 year 年和 month 月的文章。注意這里created_time是 Python 的date對象,其有一個yearmonth屬性,我們在 [頁面側邊欄:使用自定義模板標簽](http://zmrenwu.com/post/12/) 使用過這個屬性

這樣子歸檔的代碼就寫好了,

(2)分類

1.1 視圖函數
/blog/views.py

# 分類視圖
def category(request,pk):
    cate = get_object_or_404(Category,pk=pk)
    post_list = Post.objects.filter(category=cate).order_by('-created_time')
    return render(request,'blog/index.html',context={'post_list':post_list})

1.2 配置blog/urls.py 規則
/blog/urls.py

    # 分類
    url(r'^category/(?P<pk>[0-9]+)/$',views.category,name='category')

1.3 修改base.html
我們找到分類

                        {% for category in category_list %}
                        <li>
                            <a href="{% url 'blog:category' category.pk %}">
                                {{ category.name }} <span class="post-count">(13)</span>
                            </a>
                        </li>
                        {% empty %}
                        暫無分類!
                        {% endfor %}

現在我們點擊分類與歸檔的鏈接,然后就會跳轉到新的頁面了。

(這一節,沒有粘貼圖片的工作,寫的有點蛋疼,下一節用圖片寫上會稍微容易懂一些)

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容