實戰Django:Rango Part8

28.模板標籤 html


若是在每一個頁面都能顯示分類中的內容,這樣用戶在瀏覽時能夠直接從左側邊欄點擊相應的連接進行訪問,確定是很是方便的。django

要作到這點,根據咱們前面學過的知識,咱們整理一下思路:瀏覽器

  • 在base.html模板中添加一些代碼來顯示某分類的內容列表;
  • 在每一個視圖,咱們要能訪問分類對象,獲取全部的分類數據;

但這是一個糟糕的解決方案,要實現這個,咱們的視圖中會有大量的重複代碼。並且,在註冊、登陸等流程中,獲取分類數據也會是個問題。因此咱們要換種方法,使用模板標籤來獲取分類數據。服務器

(1)使用模板標籤ide

在rango文件夾下建立一個叫templatetags的文件夾,而後在下面建兩個文件,一個叫__init__.py,文件內不用寫任何內容;另外一個叫rango_extras.py,在這個文件下寫入以下內容:優化

rango/templatetags/rango_extras.py:url

from django import template
from rango.models import Category

register = template.Library()

@register.inclusion_tag('rango/cats.html')
def get_category_list():
    return {'cats': Category.objects.all()}

從上面的代碼能夠看到,咱們用了一個叫get_category_list() 的方法,關聯了「rango/cats.html模板,用來返回一個分類列表,下面咱們就來建立這個模板。spa

在templates/rango下新建一個叫「cats.html」的文件,加入以下內容:設計

templates/rango/cats.html調試

{% if cats %}
    <ul class="nav nav-sidebar">
    {% for c in cats %}
        <li><a href="{% url 'category'  c.slug %}">` c`.`name `</a></li>
    {% endfor %}

{% else %}
    <li> <strong >尚未分類哦!</strong></li>

    </ul>
{% endif %}

下面咱們來研究怎樣用上這個模板標籤,修改base.html模板,做以下改動:

templates/base.html

先在頁面頂部加入一句:

{% load rango_extras %}

而後找到」{% block side_block %}{% endblock %}「,改成:

{% block side_block %}
    {% get_category_list %}
    {% endblock %}

注意,每次修改模板標籤後,必須從新啓動網頁服務器(用runserver命令)才能生效。

(2)參數化模板標籤

下面,咱們來優化這個模板標籤,設想一下,當咱們訪問某個分類時,左側的側邊欄能將當前的分類以高亮顯示。要實現這項功能,咱們須要向模板標籤傳遞參數。

編輯rango_extras.py,做以下改動:

rango/templatetags/rango_extras.py:

def get_category_list(cat=None):
    return {'cats': Category.objects.all(), 'act_cat': cat}

而後咱們來調整」base.html「模板,傳遞一個category參數:

templates/base.html

{% block side_block %}
{% get_category_list category %}
{% endblock %}

「cats.html」一樣須要更新,改爲這樣:

templates/rango/cats.html

{% for c in cats %}
    {% if c == act_cat %} <li  class="active" > {% else  %} <li>{% endif %}
            <a href="{% url 'category'  c.slug %}">` c`.`name `</a></li>
{% endfor %}

作完以上工做,請打開瀏覽器,隨意點擊某個分類,看一下左側邊欄中的」當前分類「是否已經高亮顯示?

29.寫在最後


按照原書的進度,還有一章講用Bing的API作一個搜索功能,捨得認爲這部份內容設計上並不大合理,不如採用Django自帶的功能作一個搜索(站內搜索可參看其它例子),因此,這一節就省略掉了。有興趣的童鞋能夠翻看原書來作這個例子。

除了這一節,書中還有將近32%的篇幅來介紹JQuery、AJAX、CSS,還有一些使用技巧等等(甚至還有一章講到Git),這些一樣留給各位童鞋自行去研讀。

So,Rango這個項目介紹到這裏就告一段落了。項目中的代碼所有通過捨得的驗證、調試,書中因版本更新產生的部分錯誤捨得也做了適當的修正。這個項目很是完整,並且總體設計得比較精巧,只要你花工夫去鑽研、練習,相信能夠學到很多東西。

 

【完】

本文版權歸捨得學苑全部,歡迎轉載,轉載請註明做者和出處。謝謝!
做者:捨得
首發:捨得學苑@博客園

相關文章
相關標籤/搜索