Django模板系统-个人小结

Django 的模板系统
感觉首先要了解一下Django的哲学

哲学和限制
现在我们对于Django地模板系统有了一个感性的认识,下面我们将指出一些有意为之的限制和它工作的哲学
不像其他Web程序组件,程序员对模板系统的意见非常不一致
一个很有意思的事实:Python至少拥有数十个——如果没有上百个——的开源模板语言实现,而且看来每一个都是因为其创造者认为现有的模板不能满足他们的要求。
(事实上,据说写一个自己的模板系统是已经成了Python开发者必经的仪式了。如果你还没有写过自己的模板系统,试试看吧,真是很有意思。)
所以,Django的第一个哲学就是Django不强求你使用它的模板语言
Django的目标是提供一个full-stack框架,提供所有必须的web开发模块进行高效开发
很多时候,使用Django的模板系统很方便,但不强求你使用它
下面的“在视图中使用模板”一节我们会看到在Django中使用另一套模板语言,它同样简单易用
但我们仍强烈需要Django的模板语言的工作方式,模板系统深植于World Online和Django发明者的
Web开发方式中,下面是其中一些哲学:
1,业务逻辑应该和呈现逻辑分离
模板系统应该只负责控制显示和显示相关的逻辑我们视模板为一种控制显示和显示相关逻辑的工具,仅此而已。模板系统的功能就止于此。
基于这个原因,Django模板无法直接调用Python代码。在Django模板里,所有的程序设计活动都止于对标签的使用。
虽然你可以自定义模板标签来做任意的事情,但Django自己的模板标签不允许执行Python代码。
2,语法应该和HTML/XML解耦
Django的模板系统采用非HTML格式,如普通的文本,有些其它的模板语言是基于XML的
XML的格式容易输错,并且XML的模板解析速度也容易变得很慢而难以接受
3,页面设计者被假定为熟悉HTML代码
Django模板系统没有设计成可以在Dreamweaver等WYSISYG编辑器中显示良好
这类编辑器有很多限制,Django希望模板作者直接编辑HTML时感到舒适
4,页面设计者被假定为不是Python程序员
模板系统的作者意识到大部分Web页面的模板是页面设计者写的而不是Python程序员写的
他们不具备Python知识,但Django也允许模板用Python来写,它提供了一种直接编写Python代码
来扩展模板系统的方法(第10章会介绍更多)
5,目标不是发明一种编程语言
目标只是提供足够的编程功能,如分支和循环等决定呈现相关的逻辑用
由于上述的设计哲学,Django模板系统产生如下限制:
1,模板不能设置和改变变量的值
可以通过自定义模板标签来达到这个目标(I参看第10章),但是内置Django模板标签不允许这样做
2,模板不能调用原生Python代码
但是也可以通过自定义标签来做这件事情

这是一个练习的一部分
2,一旦完成上述任务,把table中音乐是jazz或者rock的音乐家的名字样式设为粗体
使用style=”font-weight: bold;”来修饰td格
3,一旦完成上述任务:给名字为一个字的音乐家的名字后加上星号
并且在页面上添加脚注“* Pretentious”前面的粗体字不变
笨拙的方式是使用在模板中使用{% ifequal %},视图和上面的保持不变,模板如下:

 {% for musician in musicians %}
    <tr>
    <td {% ifequal musician.genre 'jazz' %}style="font-weight: bold;"{% endifequal %}
        {% ifequal musician.genre 'rock' %}style="font-weight: bold;"{% endifequal %}>
      {{ musician.name }}
    </td>
    <td>{{ musician.genre }}</td>
    </tr>
{% endfor %}

好吧 其实我一开始就打算这么去实现但是呢 答案说这是 笨拙的实现 为什么呢 以下是解答:

这显得很罗嗦而且容易出错,Django模板系统的关键是知道显示什么 因为模板没有完备的编程语言环境的能力,
在视图里做尽可能多的业务逻辑更重要
这样一来,更清晰的解决问题的方式就是预处理音乐家的名字是否粗体
毕竟这是业务逻辑而不是呈现逻辑,呈现逻辑指出怎样显示特殊的类别而不是决定哪些类别是特殊的 这是很重要的区别,下面是视图的代码:

def musician_list(request):
    musicians = []
    for m in MUSICIANS:
        musicians.append({
            'name': m['name'],
            'genre': m['genre'],
            'is_important': m['genre'] in ('rock', 'jazz'),
        })
    return render_to_response('musician_list.html', {'musicians': musicians})

然后这样使用模板代码:

{% for musician in musicians %}
    <tr>
    <td{% if musician.is_important %} style="font-weight: bold;"{% endif %}>
      {{ musician.name }}
    </td>
    <td>{{ musician.genre }}</td>
    </tr>
{% endfor %}

也就是说 用额外的空间开销来实现 业务和视图的分离

{% for musician in musicians %}
    <tr>
    <td{% if musician.is_important %} style="font-weight: bold;"{% endif %}>
      {{ musician.name }}{% if musician.is_pretentious %}*{% endif %}
    </td>
    <td>{{ musician.genre }}</td>
    </tr>
{% endfor %}

和上个题目相似的解决思路 值得学习是添加*的写法 运用if endif来实现
https://djangobook.com/the-django-book/
这是一个文档 讲解Django的 感觉蛮不错的

猜你喜欢

转载自blog.csdn.net/weixin_39722329/article/details/81048429