Django模板系统

官方文档

每一个Web框架都需要一种很便利的方法用于动态生成HTML页面。 最常见的做法是使用模板。

模板包含所需HTML页面的静态部分,以及一些特殊的模版语法,用于将动态内容插入静态部分。

说白了,模板层就是如何往HTML文件中填入动态内容的系统。

Django可以配置一个或多个模板引擎(语言),也可以不用引擎。

Django自带一个称为DTL(Django Template Language )的模板语言,以及另外一种流行的Jinja2语言(需要提前安装,pip install Jinja2)。

Django为加载和渲染模板定义了一套标准的API,与具体的后台无关。加载指的是,根据给定的模版名称找到的模板然后预处理,通常会将它编译好放在内存中。渲染则表示,使用Context数据对模板插值并返回生成的字符串。

DTL作为Django原生的模板系统,一直到Django1.8,都是唯一的内置模版系统,可能你对它有些意见,但是它仍然是一个优秀的模版库。如果没有特别重要的理由,需要选择另外一种模版系统的话,建议坚持使用DTL,特别是在编写可插拔的应用并打算发布其模板的时候。Django很多内部组件都使用了DTL,例如django.contrib.admin,如果你不想让它们罢工,或者花费大力气进行修改,不要放弃DTL。

配置引擎

模板引擎通过settings中的TEMPLATES设置来配置。这是一个列表,与引擎一一对应,每个元素都是一个引擎配置字典。由startproject命令生成的settings.py会自定定义如下的值:

常用语法

只需要记两种特殊符号:

{% %}

变量相关的用{{}},逻辑相关的用{%%}。

变量

{{ 变量名 }}

变量名由字母数字和下划线组成。

点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。

例子:

  1. tenplate_test.html
  2. <body>
  3. {# 变量相关用{{ }} #}
  4. {{ s1 }}
  5. {# helson 字符串#}
  6. <hr>
  7. {{ l }}
  8. {#['jassin', 'lishi', 'dandan'] 列表 #}
  9. {##}
  10. <hr>
  11. {{ d }}
  12. {#{'name': 'jassin', 'age': 21} 字典#}
  13. <hr>
  14. {{ l2 }}
  15. {#对象列表#}
  16. {#[<app01.views.template_test.<locals>.Person object at 0x00000000048DD470>, #}
  17. {# <app01.views.template_test.<locals>.Person object at 0x00000000048DD358>, #}
  18. {# <app01.views.template_test.<locals>.Person object at 0x00000000048DD4E0>]#}
  19.  
  20. views.py
  21. def template_test(request):
  22. s1 = "helson"
  23. l = ["jassin","lishi","dandan"]
  24. d = {"name":"jassin","age":21}
  25.  
  26. class Person(object):
  27. def __init__(self,name):
  28. self.name = name
  29.  
  30. def dream(self):
  31. return "{}的梦想是好好生活".format(self.name)
  32.  
  33. jassin = Person("Jassin")
  34. lishi = Person("Lishi")
  35. dandan = Person("Dandan")
  36.  
  37. l2 = [jassin,lishi,dandan]
  38.  
  39. # return render(request, "template_test.html",{locals()})
  40. return render(request, "template_test.html",{"s1":s1,"l":l,"d":d,"l2":l2})
  41.  
  42. urls.py
  43. url(r'^template_test/$',views.template_test, name="template_test"),

参数

模板支持的写法

  1. {# l中的第一个参数 #}
  2. {{ l.0 }}
  3. {# 取字典中key的值 #}
  4. {{ d.name }}
  5. {# 取对象的name属性 #}
  6. {{ l2.0.name }}
  7. {# .操作只能调用不带参数的方法 #}
  8. {{ person_list.0.dream }}

注意点;

Django模板语言  对象.方法就可以执行,不需要加括号

Filters过滤器

语法: {{ value|filter_name:参数 }}

  1. html页面
  2. <body>
  3. {# 变量相关用{{ }} #}
  4. {{ s1 }}
  5. {# helson 字符串#}
  6. <hr>
  7. {{ l }}
  8. {{ l.1 }}
  9. {#['jassin', 'lishi', 'dandan'] 列表 #}
  10. {##}
  11. <hr>
  12. {{ d }}
  13. {{ d.age }}
  14. {#{'name': 'jassin', 'age': 21} 字典#}
  15. <hr>
  16. {{ l2 }}
  17. {{ l2.0.name }}
  18. {{ l2.0.dream }}
  19. <hr>
  20. {{ lili|default:"没有这个值" }}
  21. {#没有这个值#}
  22. {{ l|length }}
  23. {# 3#}
  24. {{ filesize|filesizeformat }}
  25. {#1.2 KB#}
  26. {{ s1|slice:"1:3" }}
  27. {#el#}
  28. <hr>
  29. {{ now }}
  30. {#Jan. 19, 2018, 4:37 p.m.#}
  31. <hr>
  32.  
  33. viewspy
  34. def template_test(request):
  35. s1 = "helson"
  36. l = ["jassin","lishi","dandan"]
  37. d = {"name":"jassin","age":21}
  38.  
  39. import datetime
  40. now = datetime.datetime.now()
  41.  
  42. class Person(object):
  43. def __init__(self,name):
  44. self.name = name
  45.  
  46. def dream(self):
  47. return "{}的梦想是好好生活".format(self.name)
  48.  
  49. jassin = Person("Jassin")
  50. lishi = Person("Lishi")
  51. dandan = Person("Dandan")
  52.  
  53. l2 = [jassin,lishi,dandan]
  54.  
  55. # return render(request, "template_test.html",{locals()})
  56. return render(request, "template_test.html",{"s1":s1,"l":l,"d":d,"l2":l2,"filesize":1200,"now":now})

参数

default

  1. {{ value|default: "nothing"}}  如果value值没传的话就显示nothing
    {{ lili|default:"没有这个值" }}

length

  1. 返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
    l = ["jassin","lishi","dandan"]
  2. {{ l|length }} #

filesizeformat

将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。

例如:(自动转化)

  1. "filesize":1200
  2. {{ filesize|filesizeformat }}
  3. # 1.2 KB

slice切片

  1. s1 = "helson"
  2. {{ s1|slice:"1:3" }} # 左包含右不包含
  3. # el

date格式化

  1. {{ now|date:"Y-m-d H:i:s" }}
  2. 2018-01-19 16:41:42

safe**

Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。

比如:

  1. value = "<a href='#'>点我</a>"
  2. {{ value|safe}}
    {{ s2 }}
    {#<a href='http://www.jianshu.com/'>点呀</a> 自动帮你转译成字符串#}

truncatechars

如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

参数:截断的字符数

  1. {{ s3 }}
  2. 风中的少年如今在他乡皎洁的月光寂静的晚上谁的思念伴我入梦乡。
  3. {{ s3|truncatechars:6 }} 字符 风中的...
  4. {{ s3|truncatewords:3 }} 单词(用于单词之间的空格)

自定义filter***

  1. template_test.html
  2. {% load app01_tags %}
  3. {{ s1|replace:"o"}}
  4.  
  5. app01_tags.py
  6. from django import template
  7. register = template.Library()
  8.  
  9. # {{变量|filter_name:参数}}
  10. # name 是给函数起名字,
  11. @register.filter(name="replace")
  12. def func(value,arg):
  13. return value.replace(arg,"")

参数

  1. app01/
  2. __init__.py
  3. models.py
  4. templatetags/ # 在app01下面新建一个package package
  5. __init__.py
  6. app01_filters.py # 建一个存放自定义filter的文件
  7. views.py

编写自定义filter

  1. from django import template
  2. register = template.Library()
  3.  
  4. @register.filter(name="cut")
  5. def cut(value, arg):
  6. return value.replace(arg, "")
  7.  
  8. @register.filter(name="addSB")
  9. def add_sb(value):
  10. return "{} SB".format(value)
  1. from django import template
    register = template.Library()
  2.  
  3. # {{变量|filter_name:参数}}
    # name 是给函数起名字,
    @register.filter(name="replace")
    def func(value,arg):
    return value.replace(arg,"666")

使用自定义filter

  1. {# 先导入我们自定义filter那个文件 #}
  2. {% load app01_filters %}
  3.  
  4. {# 使用我们自定义的filter #}
  5. {{ somevariable|cut:"" }}
  6. {{ d.name|addSB }}
  7.  
  8. # 将o替换成666
    {% load app01_tags %} # 导入
    {{ s1|replace:"o"}}
    {#hels666n#}

Tags(跟逻辑相关)

for

  1. <ul>
  2. {% for user in user_list %}
  3. <li>{{ user.name }}</li>
  4. {% endfor %}
  5. </ul>

for循环可用的一些参数:

for ... empty

  1. l4没有
    <ul>
  2. {% for name in l4 %}
  3. <li>{{ name }}</li>
  4. {% empty %}
  5. <li>什么都没有</li>
  6. {% endfor %}
  7. </ul>
    # 什么都没有

if,elif和else

  1. {% if user_list %}
  2. 用户人数:{{ user_list|length }}
  3. {% elif black_list %}
  4. 黑名单数:{{ black_list|length }}
  5. {% else %}
  6. 没有用户
  7. {% endif %}

当然也可以只有if和else.

  1. {% if user_list|length > 5 %}
  2. 七座豪华SUV
  3. {% else %}
  4. 黄包车
  5. {% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

with

定义一个中间变量

  1. l2.0.dream变量比较长的可以起个中间变量,别名
    {% with l2.0.dream as dream %}
  2. {{ dream }} # 这里可以直接调用那个中间变量
  3. {% endwith %}

csrf_token********

  1. 这个标签用于跨站请求伪造保护。
  2. 在页面的form表单里面写上{% csrf_token %}

------------------------------------------------模板引擎--------------------------------

模板引擎

a. 基本使用

  {{ k1 }}

  if

  for

自定义函数

b.模板中自定义函数

  在已注册的app中创建一个名字叫 templatetags 文件夹

  在任意创建一个py文件

  创建名字叫register的Library类的对象

  定义函数

  1. from django.template import Library
  2. register = Library() 
  3.  
  4.    # 调用示例:{{"jassin"|func1:"jassin,lili"}}
       # 参数最多2
       # 可以做if的
                    @register.filter
                    def meikai(a1,a2):
                        n1,n2 = a2.split(',')
                        data = "我的名字叫:%s,我喜欢%s和%s" %(a1,n1,n2)
                        return data
       
  5.  
  6.    # 调用示例:{% func3 1 2 3 4 %}
       # 参数无限制
       # 无法做if条件
       @register.simple_tag
       def func3(a1,a2,a3,a4):
          resule = a1+a2+a3+a4
          return result
      使用
        {% load xl %}
          {{ "jassin"|meikai:"lishi,lili"}}
           {% func2 1 2 3 4 %}
  7.  
  8. # 关于自己建app
      注册app
      推荐:'app01.apps.App01Config'

模板引擎示例:

  1. {% load xl %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <meta name="viewport" content="width=device-width, initial-scale=1">
  8. <title>Title</title>
  9. </head>
  10. <body>
  11. <h1>{{ k1 }}</h1>
  12. <h1>{{ k1|upper }}</h1> {# 使字母大写 #}
  13. <h1>{{ "jassin"|func1:"lishi,lili"}}</h1>
  14. <h1>{% func2 1 2 3 4 %}</h1>
  15.  
  16. {% if "sudflexsdf"|func3 %}
  17. <h1>哇哈哈哈</h1>
  18. {% else %}
  19. <h1>娃哈哈</h1>
  20. {% endif %}
  21.  
  22. {#这也是能使字母大写的方法,但不是动态的#}
  23. {# {% if k1 == 'v1' %}#}
  24. {# <h1>V1</h1>#}
  25. {# {% endif %}#}
  26.  
  27. </body>
  28. </html>

HTML

  1. # templatetags文件
    from django.template import Library
  2.  
  3. register = Library()
  4.  
  5. def func1(a1,a2):
  6. n1,n2 = a2.split(',')
  7. data = "我的名字叫:%s,我喜欢%s和%s" %(a1,n1,n2)
  8. return data
  9.  
  10. # 接收多个参数,但不能做if条件
  11. @register.simple_tag
  12. def func2(a1,a2,a3,a4):
  13. result = a1+a2+a3+a4
  14. return result
  15.  
  16. # 只能接收2个参数,可以做if条件
  17. @register.filter
  18. def func3(a1):
  19. if 'alex' in a1:
  20. return True
  21. return False
  22.  
  23. @register.filter
  24. def func4(a1):
  25. if 'alex' in a1:
  26. return True
  27. return False

Django之模板(Template)的更多相关文章

  1. Django之模板Template

    模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视 ...

  2. Django:模板template(一)

    把模板的过程.语法.标签.反向地址解析.过滤器.模板继承与HTML转义记下笔记 1.概述及demo 动态生成HTML 模板的设计实现业务逻辑(View)和显示内容(template)的分离 一个模板可 ...

  3. Django:模板template(二)

    将跨站请求伪造和验证码的东西记一下 CSRF Cross Site Request Forgery.跨站请求伪造 链接:GET请求:表单:POST请求 某些恶意的网站上,包含链接.表单.按钮.Java ...

  4. django模板(template)

    模板层(template) 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. 1 2 3 4 def current_datetime ...

  5. Django之模板配置(template)

    Django模板系统 官方文档 jinja2模块中文 jinja2模块官方 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Djan ...

  6. Django基础——模板层(template) (Day67)

    阅读目录 变量 标签 自定义过滤器和标签 模板层(template) 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. 1 2 3 4 ...

  7. Django框架简介及模板Template,filter

    Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View) ...

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

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

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

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

随机推荐

  1. 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  2. HDU 6356 Glad You Came 2018 Multi-University Training Contest 5 (线段树)

    题目中没有明说会爆int和longlong 的精度,但是在RNG函数中不用unsigned int 会报精度,导致队友debug了很久... 根据每次生成的l,r,v对区间更新m次,然后求 i*ai的 ...

  3. vm安装centos7 Minimal 配置静态ip添加dns: 解决连不上网

    去centos官网下载需要的镜像:https://www.centos.org/ 安装完成后,在centos7中,ifconfig命令已经不存在了,查看ip的命令 # ip addr 发现ens*** ...

  4. LigerUI v1.2.4 LigerGrid默认样式 工具条背景白色

    修改Aqua的ligerui-grid.css .l-panel-topbar 样式 修改为: .l-panel-topbar{padding: 0;background: #CEDFEF url(' ...

  5. HDU4639

    /*计算里面有多少个相邻的he,1个he就是1种意思,两个就是,两种,所以这是 一个斐波拉期数列,间隔的hehe互不影响所以是互斥事件,直接相乘就可以*/ #include<stdio.h> ...

  6. 介绍Web项目中用到的几款JQuery消息提示插件

    第一款 noty 官方网站:https://github.com/needim/noty 第二款 artDialog artDialog是一个精巧的web对话框组件,压缩后只有十多KB,并且不依赖其他 ...

  7. Javascript何时执行

    分以下两种情况: 1.HTML head部分的Javascript会在被调用的时候执行 需要调用才执行的脚本或事件触发执行的脚本放在head部分,这可以保证脚本在任何调用之前被预先加载,在页面加载完之 ...

  8. CentOS 7安装Xfce和VNC

    很多VPS商提供的CentOS 7镜像只有最小化安装,这样就只能在命令行下操作,如果要调试代码的话,还是图形化界面方便,而且CentOS自带的Gnome和KDE都比较占内存.启动桌面后就占用了400M ...

  9. MySQL explain 、explain extended用法

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了,如: explai ...

  10. DelayQueue与ProirityBlockingQueue

    DelayQueue是一个无界队列,只有在延迟期满的时候,才可以取出元素.该队列的头部存储的延期期满了后保存时间最长的元素. DelayQueue阻塞队列在我们系统开发中也常常会用到,例如:缓存系统的 ...