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中 ...
随机推荐
- 转:NSString / NSData / char* 类型之间的转换
1. NSString转化为UNICODE String: (NSString*)fname = @“Test”; char fnameStr[10]; memcpy(fnameStr, [fname ...
- 简便开发插件 -- lombok
lombok是一款可以精减java代码.提升开发人员生产效率的辅助工具,可以利用注解在编译期自动生成setter/getter/toString()/constructor代码. 彻底将开发人员从繁琐 ...
- 编写可维护的js代码
在工作中,制定一套统一的编码风格,可以提高开发效率,维护起来的也要容易很多,也能避免一些不必要的错误出现. 项目中常用的检查编码风格的工具JSLint.JSHint.JSCS.ESLint,,在这呢, ...
- 在IDEA中实战Git 实用
工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程Git仓库上获取项目源码 场景三:小 ...
- Linux 常见文件及目录
文件/etc//etc/passwd用户基本信息/etc/group用户组基本信息/etc/shadow/etc/passwd 文件的补充/etc/gshadow阴影口令套组中的组配置文件/etc/l ...
- Java并发编程原理与实战三十五:并发容器ConcurrentLinkedQueue原理与使用
一.简介 一个基于链接节点的无界线程安全队列.此队列按照 FIFO(先进先出)原则对元素进行排序.队列的头部 是队列中时间最长的元素.队列的尾部 是队列中时间最短的元素.新的元素插入到队列的尾部,队列 ...
- 训练赛第三场A题 zoj 559
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2559 解题报告:比赛的时候的想法是可以确定至少有两对相切的圆,所 ...
- HTML5之2D物理引擎 Box2D for javascript Games 系列 第一部分
我要的是能在H5页面上跑的javascript版的Box2D啊!!! 最近想学习Javascript版本的Box2D JS物理引擎,无奈搜了半天也没找到相对比较系统的资料 官方网站也只是简单的介绍,A ...
- 读后感+资源-----java8函数式编程pdf
花了两周时间工作之余抽空读完了这本书,对lamdba以及java的理解又有了一个新的认识(装个逼,哈哈) 以前看视频学习的还是太基本了,感觉读书更容易理解背后的设计思想和编程思路 这本书还是挺不错,就 ...
- Nginx中worker_connections的问题
查看日志,有一个[warn]: 3660#0: 20000 worker_connections are more than open file resource limit: 1024 !! 原来安 ...