Django实战(6):对比RoR和Django的模板系统
scaffold的生成物虽然用处不大,但是给我们带来一些最佳实践。其中就有模板的继承和分区。
如果你深入使用过rails的模板体系,那么恭喜你:你有超强的忍耐力!而且更重要的是,你只需要3分钟就可以理解Django的模板体系。
让我们先回顾一下rails的模板系统:
1. 你创建了一个xxxview,展现出一些数据。
2. 你意识到,各个view都有一些共同的内容。因为rails也强调DRY,所以你决定将这些共同的部分抽取出来。rails也看到了这点,所以你很高兴的看到,rails支持layout。
3. rails的layout很简单,类似html的代码,<%= yield %>部分会被具体视图替代,于是你很欣慰。
4. 但是等等,如何指定layout?你又兴奋地发现:默认的layout是views/layouts/application.html.erb,你可以 在controller、action去指定特定的layout,甚至这种指定支持变量。在兴奋之余,你完全忽视了这等于让controller去做了 view该做的事情。
5. 你实现了一个左右结构的layout,左侧是导航,右侧是内容。你认为这个layout应该可以被多个view使用。但是你又发现不同的view需要的导 航是不同的。由于存在几个view使用一种导航、另外几个view使用另一个导航的情况,由于DRY,rails说,我有partial。在view中可 以使用<%= render "foo/bar" %>,甚至可以使用变量:controller/action 中指定具体的partial。:render :partial => ’foo/bar’。尽管,controller更进一步干预了view的细节;尽管,你又要记住:partial: foo/bar 意味着 views/foo/_bar.html.erb.<%= render @mypartial %>然后在
6. 如果view中的多块内容要插到layout的不同地方怎么办?除了主要的内容外,你还可以在view中定义:
foo foo foobar bar bar
然后这些内容块会分别插入到layout的<%= yield :foo %> <%= yield :bar %> 和<%= yield %>的地方。
7. 还有,还有,<%= stylesheet_link_tag "application" %>, <%= javascript_include_tag "html5" %> ……
到这里,你可以说自己已经了解rails的模板系统了吗?
接下来我们可以放松心情了,因为Django的模板很容易理解,除了基本的变量、标签、过滤器等之外,模板的关系只有两个:
1. 包含。将模板中的相同部分提取出来共用。
可以使用硬编码的字符串{% include ’foo/bar.html‘ %} 或者变量名 {% include template_name %},变量当然是在view中赋值(注意,不是controller中)
2. 继承。 模板继承是Django解决共用页面区域DRY的一个优雅的解决方案。简单地说就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载(override)。基础模板中,将内容不同的部分指定各个内容块:
{% block foo %}
<div>default content of foo</div>
{% endblock %}
...
{% block bar %}
<div>default content of bar</div>
{% endblock %}
Django实战(6):对比RoR和Django的模板系统的更多相关文章
- Django实战(8):对比RoR与Django的输入校验机制
rails有一个”简洁.完美的验证机制,无比强大的表达式和验证框架“.在<Agile Web Development with Rails 4th>一书的7.1节向我们展示了如何验证Pro ...
- 【Django】Python web开发:几个模板系统的性能对比(转)
http://blog.chedushi.com/archives/910 结论: 点评一下吧.django就是个渣,不多废话了.webpy的代码很简洁,可惜速度太慢了.bottle看起来快一点,不过 ...
- Django实战(16):Django+jquery
现在我们有了一个使用json格式的RESTful API,可以实现这样的功能了:为了避免在产品列表和购物车之间来回切换,需要在产品列表界面显示购物车,并且通过ajax的方式不刷新界面就更新购物车的显示 ...
- Django实战(15):Django实现RESTful web service
曾几何时,Ajax已经统治了Web开发中的客户端,而REST成为web世界中最流行的架构风格(architecture style).所以我们的选择变得很简单:前端ajax访问后端的RESTful w ...
- Django实战(3):Django也可以有scaffold
rails有一个无用的”神奇“功能,叫做scaffold.能够在model基础上,自动生成CRUD的界面. 说它无用,是因为rails的开发者David说,scaffold”不是应用程序开发的目的.它 ...
- 第一个Django应用 - 第三部分:Django视图和模板
一.概述 一个视图就是一个页面,通常提供特定的功能,使用特定的模板.例如:在一个博客应用中,你可能会看到下列视图: 博客主页:显示最新发布的一些内容 每篇博客的详细页面:博客的永久链接 基于年的博客页 ...
- 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程
点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...
- 6、Django实战第6天:用户登录
今天开始,我们需要来写后台逻辑了.... 后台逻辑代码都是编写在views.py文件里面,今天要完成的登录功能,因此来编辑users.views.py 这里我们根据请求方法来判断分为2种情况,网页默认 ...
- Django实战-用户注册和登陆系统
1.环境搭建和创建项目 1.环境搭建 每当我们开始一个新项目的时候,通常都会搭建一个全新.独立.隔离的项目环境,这样做的好处自然不必多说.有很多种建立项目虚拟环境的工具,使用比较普遍的是Python中 ...
随机推荐
- 安装并使用 Wowza 发布你的 RTMP 直播流
转载自:http://blog.csdn.net/defonds/article/details/11979095 I. 下载 Wowza 官方下载地址 http://www.wowz ...
- 科学计算三维可视化---Mayavi入门(Mayavi管线)
一:Mayavi管线 mlab.show_pipeline() #显示管线层级,来打开管线对话框 (一)管线中的对象scene Mayavi Scene:处于树的最顶层的对象,他表示场景,配置界面中可 ...
- Kafka 0.8 Consumer Rebalance
1 Rebalance时机 0.10kafka的rebalance条件 条件1:有新的consumer加入 条件2:旧的consumer挂了 条件3:coordinator挂了,集群选举出新的coor ...
- Ubuntu16.04.2安装Tensorflow
安装aptitude $ sudo apt-get install aptitude 安装python-pip python-dev $ sudo aptitude install python-pi ...
- Elasticsearch技术解析与实战(四)shard&replica机制
序言 shard&replica机制 1.index包含多个shard 2.每个shard都是一个最小工作单元,承载部分数据,lucene实例,完整的建立索引和处理请求的能力 3.增减节点时, ...
- 个人集群部署hadoop 2.7 + hive 2.1
环境:centos 6.6 x64 (学习用3节点) 软件:jdk 1.7 + hadoop 2.7.3 + hive 2.1.1 环境准备: 1.安装必要工具 yum -y install open ...
- git之合并分支(git merge)------(三)
最近几天写小demo,总是自己拉取他人的代码,然后创建分支,在自己的分支上进行修改,然后提交到自己的分支,具体的这一步,我就不多讲了,因为在我的博客“工作中常用的Git操作”中有详细的介绍,今天主要讲 ...
- 关于Python编码问题小记
Python编码问题小记: 引子: 最近在复习redis,当我在获取redis的key的时候,redis 存储英文和汉字下面这个样子的,我知道汉字是用16进制的UTF-8编码了,然后突然很想搞清楚字符 ...
- 在Linode VPS上搭建离线下载神器Aria2+WEBUI管理及对国内云盘看法
在Linode VPS上搭建离线下载神器Aria2+WEBUI管理及对国内云盘看法 2015-09-21 by Hansen 原文链接:http://www.hansendong.me/archive ...
- [转]GCC常用参数详解
简介gcc and g++现在是gnu中最主要和最流行的c & c++编译器 .gcc/g++在执行编译工作的时候,总共需要以下几步:1.预处理,生成.i的文件[预处理器cpp]2.将预处理后 ...