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

    【完】

    本文版权归舍得学苑所有,欢迎转载,转载请注明作者和出处。谢谢!
    作者:舍得
    首发:舍得学苑@博客园

     
  • 相关阅读:
    Oracle操作步骤
    Jquery 使用Ajax获取后台返回的Json数据后,页面处理
    Win10 CMD中文乱码解决
    GIT库中禁止追踪文件变化的两种方式
    Google Chrome升级到81.x之后http请求自动转https的解决方案
    【rabbitmq】Queueingconsumer被废止后老代码如何做的解决方案
    使用线程池测试cpu的并发计算能力
    springmvc线程安全问题
    zookeeper初体验之关于解决quartz重复执行任务的一种思路
    restful风格的webservice开发之概念准备篇
  • 原文地址:https://www.cnblogs.com/emagic/p/4517128.html
Copyright © 2011-2022 走看看