来看一段代码

def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)

直接把HTML页面嵌套在视图函数里返回给浏览器并不是一个好主意;

原因:

1、对页面设计进行的任何改变都必须对 Python 代码进行相应的修改,牵一发而动全身;

2、Python 代码编写和 HTML 设计是两项不同的工作,前端开发和后端开发无非 并行;

基于这些原因,将HTML页面的设计和后端逻辑设计分离,会更简洁、容易维护开发我们的WEB应用。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式,这就是本章要具体讨论的问题。

模板是什么?      

Django自带的模板语言=  HTML代码+逻辑控制代码,注意 模板 != HTML,模块 =HTML代码+逻辑控制代码(特殊标记);

模板作用?

在server端 把后端的变量 嵌入到HTML中渲染后,返回给浏览器来达到前后端代码分离,页面动态显示的目的;

一、Django模板语言应用:

Django模板语言的语法主要分为2种: {{变量}}    和   {%  Tag %} ,{{变量 }}主要用于和视图变量做替换,{% tag %}主要用于做逻辑判断和实现某些功能,正因有了数据+逻辑才构成了模板语言;

1.1、使用双大括号引用视图中的变量

语法:{{ 变量}} ,列表取值:{{列表. 索引}}, 字典取值:{{字典.键}}

1.2:内置变量过滤器的使用

如果引用得视图变量,不能直接渲染使用,可以借助fifter进行数据的二次处理,就像Python中的内置函数;

语法:{{ 变量|fifter:参数 }}

过滤器列表:

  1. add:给变量加上相应的值、
  2. addslashes :单引号加上转义号,一般用于输出到javascript中
  3. capfirst :第一个字母大写
  4. {{ "123spam456spam789"|cut:"spam" }}查找删除指定的字符串
  5. {{ l1|slice:":2" }} 列表切边
  6. {{ t|date:'Y-m-d' }} 转换特定时间格式
  7. {{ s|default:'空空如也' }} 值不存在,使用指定值
  8. {{ info|truncatechars:18 }} 渲染指定长度的字符
  9. {{ info1|truncatewords:9 }}渲染指定长度的单词
  10. {{ a|safe }} 声明安全可以渲染

实例

视图

from django.shortcuts import render
import datetime
def fifters(request):
i=10
w="A'B'C'D'E"
f='china'
t=datetime.datetime.now()
s=''
l1=[98890,765,9870,7654]
info='嘲笑我吧你们这些毫无眼光的人,我必将引来雷霆万钧的力量,摧古拉朽得战胜一切敌人!'
info1='You laugh at me without the vision of people, and I will lead to an irresistible force power, corruption must defeat all enemies destroy gura!'
li=['a','b','c','d','e','f','g']
str1='{{hello world}}'
a='<a href="黄色网址">点击我</a>'
fhjsaldfhjsdfhlasdfhljsdal='hellow world'
return render(request,'modals.html',locals())

模板

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板渲染</title>
</head>
<body> <p>{{ i|add:200 }}</p>
<p>{{ w|addslashes}}</p>
<p>{{ f|capfirst }}</p>
<p>{{ "123spam456spam789"|cut:"spam" }}</p>
<p>{{ t|date:'Y-m-d' }}</p>
<p>{{ l1|slice:":2" }}</p>
<p>{{ s|default:'空空如也' }}</p>
<p>{{ info|truncatechars:18 }}</p>
<p>{{ info1|truncatewords:9 }}</p>
<p>
{% csrf_token%}
{% for foo in li %}
<li>{{ forloop.counter0 }}----->{{ foo }}</li>
{% empty %}
<li>没有符合的对象</li>
{% endfor %} </p>
<p> <p>{{ a|safe }}</p>
</body>
</html>

2.1、内置标签(tag)的使用

如果引用到了视图中的变量,还不足以渲染出一个完美的页面,那就要借助tag标签,做逻辑控制和功能完善了;

语法格式: {% tags %}

{% for %}  {% endfor %}   for循环

{% for row in list %}
</tr>
<td>{{ row.id }}</td>
<td>{{ row.name }}</td>
<td>{{ row.title }}</td>
<td><a href="#" onclick="show_modal(this)">添加</a></td>
<td id="del_s"><a href="#" onclick="modal_del(this)">删除</a> </td>
<td><a href="#"onclick="modal_edit(this)">编辑</a></td>
</tr> {% endfor %}

{% if %}{% endfor %} if判断

基本语法格式如下:

{% if condition %}
... display
{% endif %}

或者:

{% if condition1 %}
... display 1
{% elif condition2 %}
... display 2
{% else %}
... display 3
{% endif %}
<select name="class_id" id="">
{% for row in dict %}
{% if row.id == name1.class_id %}
<option selected value="{{ row.id }}">{{ row.title}}</option>
{%else%}
<option value="{{ row.id }}">{{ row.title}}</option>
{%endif%}
{% endfor %}
</select>

{% if row.id in cids%}  in 成员关系判断

<p>任教课程:
<select name="class_id" multiple size="5">
{% for row in clas %}
{% if row.id in cids%}
<option selected value={{ row.id}}>{{ row.title}}</option>
{%else%}
<option value={{ row.id}}>{{ row.title}}</option>
{% endif %}
{% endfor %}
</select>
</p>

{% empty %}   没有渲染到数据,提示。

{% for foo in li %}
<li>{{ forloop.counter0 }}----->{{ foo }}</li>
{% empty %}
<li>没有符合的对象</li>
{% endfor %}

{% verbatim %}{% endverbatim %} 禁止渲染

视图
str1='{{hello world}}'
模板
{% verbatim %}
{{ str1 }}
{% endverbatim %}

{% csrf_token %}

用于生成csrf_token的标签,用于防治跨站攻击验证(csrf)。 其实,这里是会生成一个input标签,和其他表单标签一起提交给后台的。

{% url %}  引用路由分配系统配置的 path 别名

<form action="{% url "bieming"%}" >
<input type="text">
<input type="submit"value="提交">
{%csrf_token%}
</form>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<p>{{args}}</p>
<p>{% url "zhangge" i i1%}</p>
</body>
</html>

 

二、自定义fifter和simp-tag

模板语言自带的tag和过滤器,在某些情况下还不能满足我的功能需求,例如无法实现递归显示需求等,可以自定义fifter和tag;就像Python内置函数和自定义函数关系;

1、在app中创建 templatetags目录或Python包(必须名为 templatetags

2、templatetags文件夹下随便创建个Python文件,自定义函数;

from django import template
register =template.Library()
#模板过滤器{{变量|myupper}},最少带一个参数,最多带两个,
@register.filter()
def myupper(myname,pstr):
return myname.upper()+pstr
#自定义的函数.参数没有限制,模板已空格的形式表示一个参数
@register.simple_tag()
def myfun(nid,sid,pid):
return nid+sid+pid

3、注册到setings.py文件里

4、加载到模板里

{% load fun %}
<!doctype html>
<html>
<head>

 5、引用到模板

{{myname|myupper:'abc'}}

{% myfun 'abc' '321' '456' %}

6、自定义fifter和simp-tag 区别

1、simple-fifter

优点:支持iif else 条件判断

 {% if  i|mutil:20 > 100 %}
<p>大于</p>
{% else %} }}
<p>小于</p>
{% endif %}

缺点:simple-fifter类型的函数只支持2两个参数

2、simple-tag

优点:simple-fifter类型 无限制传参

{% mutil2 78 90 20 %} #参数无限制

缺点:不支持iif else 条件判断

Django框架-模板系统的更多相关文章

  1. python 之 Django框架(模板系统、过滤器、simple_tag、inclusion_tag、Tags、母版、组件)

    12.35 Django模板系统 {{ }}和 {% %},变量相关的用{{}},逻辑相关的用{%%} app02/views: # 模板语言测试函数 def template_test(reques ...

  2. python学习笔记--Django入门二 Django 的模板系统

    为了使网站更干净简洁更容易维护,页面的设计和Python的代码必须分离开.我们可以使用Django的 模板系统 (Template System)来实现这种模式. 几个简单的模板标签(tag):   ...

  3. 第四章:Django 的模板系统(转)

    在之前的章节中,你可能觉得例子中视图返回文本有点不妥.即是, HTML 是直接写在 Python 代码中的.     这种做法会导致这些问题:     要做任何设计上的更改就必须改写 Python 代 ...

  4. Django框架-模板层

    Django框架-模板层 一.模板语法传值 1.验证是否python所有的数据类型都可以传递到前端 locals()的妙用:该方法虽然好用,但是在某些情况下会造成资源的浪费 结论:整型.浮点型.字符串 ...

  5. 3/21 Django框架 模板路径及模板过滤器 1.模板路径查找

    3/21 Django框架 模板路径及模板过滤器 1.模板路径查找 先找settings.py里的TEMPLATES列表下的DIRS路径.如果APP_DIRS为True,还会到注册了的APP文件夹下依 ...

  6. django框架--路由系统

    目录 一.路由系统理解 二.路由系统功能划分 三.路由表创建 创建工具 二级路由 路由别名 动态路由及重定向 四.自定义错误页面 五.图示路由系统在框架中的定位 六.路由系统的进阶想法 一.路由系统理 ...

  7. Django实战(6):对比RoR和Django的模板系统

    scaffold的生成物虽然用处不大,但是给我们带来一些最佳实践.其中就有模板的继承和分区. 如果你深入使用过rails的模板体系,那么恭喜你:你有超强的忍耐力!而且更重要的是,你只需要3分钟就可以理 ...

  8. Django的模板系统

    一.语法 关于模板渲染只需要记住两种特殊符号(语法): {{ }} 和 {% %}  (变量相关用{{ }}  逻辑相关用{% %}) 二.变量 在Django的模板语言中按照{{ 变量名 }}来使用 ...

  9. Django框架----路由系统(详细)

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. ...

随机推荐

  1. Java序列化与反序列化学习(二):序列化接口说明

    一.序列化类实现Serializable接口 Serializable接口没有方法,更像是个标记.有了这个标记的Class就能被序列化机制处理. ObjectOutputStream只能对Serial ...

  2. 关于linux PPA源问题

    添加PPA: 1.首先进入ubuntu系统,system—>administration—>update manager—>setting,在软件源界面,点击other softwa ...

  3. ISO/IEC14443 ATS(Answer to Select)详解

    原文: https://www.duoluodeyu.com/2322.html 发表评论 777 A+ 所属分类:智能卡   长度字节TL 格式字节T0 接口字节TA(1) 接口字节TB(1) 接口 ...

  4. Linux(deepin)安装Oracle JDK

    sudo add-apt-repository ppa:webupd8team/java sudo apt-get update sudo apt-get install oracle-java8-i ...

  5. (转)LUA正则表达式不完全指南

    转自剑侠论坛,并稍微修改个别文字. 好不容易闲下来,研究了一下正则表达式,然后越钻越深,经过跟大神们讨论学习后,就没有然后了.总之╮(╯▽╰)╭很有用的一个东西,至少对于用户输入的读取方面会比较方便, ...

  6. TCP会话劫持_转

    前言通常,大家所说的入侵,都是针对一台主机,在获得管理员权限后,就很是得意:其实,真正的入侵是占领整个内部网络.针对内部网络的攻击方法比较多,但比较有效的方法非ARP欺骗.DNS欺骗莫属了.但是,不管 ...

  7. 大数据(7) - zookeeper的安装与使用

    简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...

  8. PHP实现懒加载

    寻常php的加载是通过include(),require()等方法来加载外部文件,之后再通过实例调用方法或直接调用静态方法,而这样子写引入语句实在很麻烦,有的框架会将特定路径的文件全部引入,直接实例化 ...

  9. 关于Jquery Ajax的用法

    今天简单描述一下Jquery Ajax的用法,和我在使用过程中的一些看法,仅供自己娱乐和大家参考值之用! Jquery Ajax的重要性不言而喻,只从Jquery面世之后,终于解救了像我这种既做前台又 ...

  10. 从客户端检测到有潜在危险的Request.Form 值”错误提示

    http://www.cnblogs.com/UouHt/archive/2008/10/30/1322697.html asp.net开发中,经常遇到“从客户端检测到有潜在危险的Request.Fo ...