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这个项目介绍到这里就告一段落了。项目中的代码所有通过舍得的验证、调试,书中因版本更新产生的部分错误舍得也做了适当的修正。这个项目很是完整,并且总体设计得比较精巧,只要你花工夫去钻研、练习,相信能够学到很多东西。
【完】