实战Django:Rango Part8

28.模板标签



如果在每个页面都能显示分类中的内容,这样用户在浏览时可以直接从左侧边栏点击相应的链接进行访问,肯定是非常方便的。

要做到这点,根据我们前面学过的知识,我们整理一下思路:

  • 在base.html模板中添加一些代码来显示某分类的内容列表;
  • 在每个视图,我们要能访问分类对象,获取所有的分类数据;

但这是一个糟糕的解决方案,要实现这个,我们的视图中会有大量的重复代码。而且,在注册、登录等流程中,获取分类数据也会是个问题。所以我们要换种方法,使用模板标签来获取分类数据。

(1)使用模板标签

在rango文件夹下创建一个叫templatetags的文件夹,然后在下面建两个文件,一个叫__init__.py,文件内不用写任何内容;另一个叫rango_extras.py,在这个文件下写入如下内容:

rango/templatetags/rango_extras.py:

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模板,用来返回一个分类列表,下面我们就来创建这个模板。

在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这个项目介绍到这里就告一段落了。项目中的代码全部经过舍得的验证、调试,书中因版本更新产生的部分错误舍得也作了适当的修正。这个项目非常完整,而且整体设计得比较精巧,只要你花工夫去钻研、练习,相信可以学到不少东西。

【完】

本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!

作者:舍得

首发:舍得学苑@博客园

 
时间: 2024-10-28 11:08:12

实战Django:Rango Part8的相关文章

实战Django:Rango Part1

在前面我们已经陆续学习了六个Django的实例,其中一个来自Django官方的文档,另外五个来自<Django Web开发指南>.舍得介绍的每一个实例,都是按照官方文档的标准,力求让大家在根据文章去做自己的实例时,能够按"文"索骥,轻松再现整个实例的制作过程. 接下来,舍得要介绍一个大型的实例,这个项目叫做Rango,它来自Django圈内口碑甚佳的<How to Tango with Django>一书.事实上,此书就是围绕Rango这一个实例来展开的,而且,

实战Django:Rango Part6

24.优化模板 在这个项目中,从已经做过的模板来看,你可能会注意到里面有很多重复的代码.这种重复不仅带来大量无谓的工作量,而且以后调整起来也极为不便. 因此,最理想的做法是将那些重复的代码放到基础模板中,然后从基础模板再扩展出一个个新的模板. 我们先来做这个基础模板,在templates/rango文件夹下新建一个base.html文件,然后添加以下内容: templates/rango/base.html: <!DOCTYPE html> <html> <head>

实战Django:Rango Part7

26.用Django-Registration-Redux进行用户校验 Django中,有好多现成的应用提供了注册.登录.校验等功能,我们只要稍稍改动一下URL映射.视图和模板就可以使用它们.在这一章,我们将介绍用Django-Registration-Redux,顺便学习一下如何把外部的应用加到我们的项目中. (1)安装Django-Registration-Redux 在Dos命令提示符下转到Python的Scripts文件夹,然后运行如下命令: pip install django-reg

实战Django:简易博客Part1

舍得学习新技能的时候,通常不喜欢傻读书--捧着一本阐述该项技能的书籍,然后傻看,一路看下来,脑子里塞满了新的概念.知识点,头是越来越大,但技能却几乎没掌握半分. 多年来,舍得养成了用做实例来学习新技能的习惯.这可不是舍得的独创,在象棋.围棋界中,历来有"打谱"一说,就是根据棋谱,把一步步棋摆出来,在打谱的过程中,去感悟.去吸收,此时感悟到的.吸收进的,才是属于你自己的东西.新的技能就这样一步步发展起来,逐渐壮大. 就象Django官方文档那样,一个实例看起来很简单,但作为初学者,用&q

实战Django:简易博客Part2

在Part1中,我们完成了本项目的基本框架搭建,并完善了一下管理后台,现在我们来看如何设计面向公共的页面部分. 8.创建模板 首先,请在blog文件夹下建立templates文件夹,然后,在templates文件夹中建立一个叫bog的文件夹,在这个bog文件夹下新建一个archive.html文件,这个文件的路径应该是: bog/templates/bog/archive.html 把下面这些代码添加到archive.html中: bog/templates/bog/archive.html:

实战Django:小型CMS Part2

回顾一下我们之前讲过的几个实例的流程,现在,我们只要添加一些内容(用来测试),创建视图.模板和URL模式,就能完成这个小型的CMS了.   7.添加内容 我们先来创建一个分类,点击Categories后面的"增加"按钮,然后在Label文本框中输入:"Django",在slug文本框后面输入"django"(django不用输入也能自动出现,你可以改成自己喜欢的名字): 随后点击后面的"保存"按钮. 点击左上方的"首

实战Django:Pastebin

  这是<Django Web开发指南>中的最后一个实例.如果说上一个实例Liveblog重点讲的是Django和Ajax的协作,那么我们在Pastebin中,将学习到Django和高亮语法JS的协作,顺便复习一下在Django中加入表单. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject pastebinpr

实战Django:官方实例Part1

[写在前面] 撰写这个实战系列的Django文章,是很久之前就有的想法,问题是手头实例太少,一旦开讲,恐有"无米下锅"之忧. 随着对Django学习的深入,渐渐有了些心得,把这些心得整理出来,以规范的.方便新人上手的撰写方式来写这个实战系列,相信对刚接触Django的童鞋会有一定的帮助. 舍得这里所用到的版本,为Django 1.7.1,Python 3.2,想要按照舍得讲解的实例上手练习的话,请务必与舍得所用的版本保持一致. 实例是在Windows系统下调试的,如果你采用的是非Win

实战Django:小型CMS Part1

CMS,即Content Management System,内容管理系统.我们这里要开发的小型CMS应用,从结构上和blog应用有些类似,但我们会在这里加入一些新的技术,比如说工作流.搜索功能.编辑组件等. 1.创建项目和应用 我们先来创建本实例的项目,在dos命令提示符下转到Scripts文件夹(如"c:\python32\Scripts"),然后运行如下命令: $ django-admin startproject cmsproject 然后在dos命令提示符下继续输入如下命令,

实战Django:LiveBlog

<Django Web开发指南>的实例讲的差不多了,除了今天要介绍的LiveBlog,还有一个Pastebin.这样,书中的实例基本讲完了.做完这些实例之后,舍得建议回头看看这本书,或许你会从书中找到舍得所讲的实例里忽略掉的一些细节.此外,<Django Web开发指南>中有几个章节是关于Django的基础或高级技术的,建议阅读并设法把它应用到你所练习过的实例中. 正如你已经看到的,Django提供了丰富的内置功能,你可以很轻松地用这些功能来完成很多工作.但和所有的工具一样,Dja