28.模板標籤 html
若是在每一個頁面都能顯示分類中的內容,這樣用戶在瀏覽時能夠直接從左側邊欄點擊相應的連接進行訪問,確定是很是方便的。django
要作到這點,根據咱們前面學過的知識,咱們整理一下思路:瀏覽器
但這是一個糟糕的解決方案,要實現這個,咱們的視圖中會有大量的重複代碼。並且,在註冊、登陸等流程中,獲取分類數據也會是個問題。因此咱們要換種方法,使用模板標籤來獲取分類數據。服務器
(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這個項目介紹到這裏就告一段落了。項目中的代碼所有通過捨得的驗證、調試,書中因版本更新產生的部分錯誤捨得也做了適當的修正。這個項目很是完整,並且總體設計得比較精巧,只要你花工夫去鑽研、練習,相信能夠學到很多東西。
【完】