一、模板概念

1、Django通过模板动态生成html

2、模板的加载位置

模板一般建立在templates文件夹中,全局路径的设置在settings.py中

​ DIRS:决定了整个项目的模板路径的位置

​ APP_DIRS:决定每个应用的模板路径是否可用,是否在应用的templates目录中寻找模板

  1. TEMPLATES = [
  2. {
  3. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  4. 'DIRS': [os.path.join(BASE_DIR, 'templates')],
  5. 'APP_DIRS': True,
  6. 'OPTIONS': {
  7. 'context_processors': [
  8. 'django.template.context_processors.debug',
  9. 'django.template.context_processors.request',
  10. 'django.contrib.auth.context_processors.auth',
  11. 'django.contrib.messages.context_processors.messages',
  12. ],
  13. },
  14. },
  15. ]

3、Template的作用

①呈现给用户的界面

②实现MVT中VT的解耦,VT有着N:M的关系,一个V可以调用任意的T,一个T也可以供任意的V使用

4、模板处理的过程

本质上是返回httpresponse.

①、加载

读取指定的html文件

  1. from django.template import loader
  2.  
  3. tp = loader.get_template('a.html')

②、渲染

以context设置的数据,处理html文件中模板的语句和变量,并生成html网页内容

  1. # content = temp.render() #直接加载模板,不返回任何变量
  2. content = temp.render(context={'msg':'哈哈哈'}) # 给前端返回msg
  3. return HttpResponse(content)

③加载以及渲染

Django中直接可以使用render()方法返回模板页面。

  1. from django.shortcuts import render
  2.  
  3. def index(request):
  4. # 本质上也是返回HttpResponse
  5. return render(request, 'index.html')

5、模板引擎

Django框架使用Django的模板引擎,本质是一个类,实现相关功能,继承自BaseEngine

可以解释模板变量和模板标签

二、模板变量

1.语法

①html中直接访问变量:{{变量名}}

②点语法

访问复杂类型变量,例如list,dict,obj类型的变量

​(1)获取属性:cake.name

(2)索引:fruits.0

(3)字典:dict.key

  1. from django.shortcuts import render
  2.  
  3. def pass_dict(request):
    data = {
    'name':'apple',
    'price':12.5,
    'color':'yellow'
    }
    return render(request,'var/var_demo.html',{'mydict':data})
  4.  
  1. class Cake:
    def __init__(self,name,price):
    self.name = name
    self.price = price
  2.  
  3. def order_cake(self):
    return '订购一个名字为:'+str(self.name) +'价格为:'+str(self.price)+'的蛋糕'
  4.  
  5. def pass_object(request):
    cake = Cake('生日蛋糕',12.4)
    return render(request,'var/var_object.html',{'cake':cake})
  6.  
  7. def pass_list(request):
    fruits = ['apple','火龙果','香蕉','菠萝']
    return render(request,'var/var_list.html',{'fruits':fruits})
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. 水果名称:{{ mydict.name }} <br>
  9. 水果价格: {{ mydict.price }} <br>
  10. 水果颜色: {{ mydict.color }}<br>
  11. </body>
  12. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. 蛋糕名字:{{ cake.name }}
  9. 蛋糕价格:{{ cake.price }}
  10. 调用蛋糕的无参(除了self参数)方法:{{ cake.order_cake }}
  11. </body>
  12. </html>
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>fruits</title>
  6. </head>
  7. <body>
  8. 列表的第一项:{{ fruits.0 }}
  9. 列表的第三项:{{ fruits.2 }}
  10. </body>
  11. </html>

2.locals()方法

locals() 函数会以字典类型返回当前位置的全部局部变量。

对于函数, 方法, lambda 函式, 类, 以及实现了 call 方法的类实例, 它都返回 True

locals 是只读的,不可修改

  1. from django.shortcuts import render
  2.  
  3. def pass_dict(request):
  4. data = {
  5. 'name':'apple',
  6. 'price':12.5,
  7. 'color':'yellow'
  8. }
  9. return render(request,'var/var_demo.html',locals())

三、模板标签

1、if标签

①语法:

  1. {% if 表达式 %}
  2. 语句
  3. {% elif 表达式 %}
  4. 语句
  5. {% else %}
  6. 语句
  7. {% endif %}

【 注意:可以在if后添加and、or、not,逻辑判断符号。判断是否相等,使用"=="符号。】

  1. from django.shortcuts import render
  2.  
  3. def if_view(request, score):
  4. score = float(score)
  5. return render(request,'tags/if_tag.html',locals())
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>if标签</title>
  6. </head>
  7. <body>
  8. {% if score >= 90 %}
  9. <h3>优秀</h3>
  10. {% elif score >= 80 %}
  11. <h3>良好</h3>
  12. {% elif score >= 70 %}
  13. <h3>一般</h3>
  14. {% elif score >= 60 %}
  15. <h3>及格</h3>
  16. {% else %}
  17. <h3 style="color: red">不及格</h3>
  18. {% endif %}
  19. </body>
  20. </html>

2.for标签

①、语法:

  1. {% for 循环变量 in 循环序列 %}​
  2.  
  3. {{ 循环变量 }}
  4.  
  5. {% empty %}​
  6.  
  7. 如果循环序列为空,执行此处
  8.  
  9. {% endfor %}

【注意:使用for标签循环时,有一个forloop模板变量,用来记录当前循环进度的。forloop的常用属性:counter、first、last。​ 如果要进行反向循环,则在for标签的循环序列后加上reversed。】

【empty:只有当传过来的循环序列为空的时候在会调用】

(1)forloop.counter 表示当前是第几次循环,从1数数

(2)forloop.counter() 表示当前是第几次循环,从0数数

(3)forloop.revcounter 表示当前是第几次循环,倒着数数,到1停

(4)forloop.revcounter() 表示当前第几次循环,倒着数,到0停

(5)forloop.first  是否是第一个, 布尔值

(6)forloop.last 是否最后一个,布尔值

  1. def for_view(request):
  2. countrys = []
  3. links = ['娱乐','体育','新闻','学习']
  4. return render(request,'tags/for_tag.html',locals())
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>for标签</title>
  6. </head>
  7. <body>
  8. {% for link in links %}
  9. {{ link }}
  10. {% if not forloop.last %}
  11. |
  12. {% endif %}
  13. {% endfor %}
  14.  
  15. {% for country in countrys %}
  16. {{ country }}
  17. {% empty %}
  18. <h3>没有国家如何遍历?</h3>
  19. {% endfor %}
  20.  
  21. </body>
  22. </html>

3、注释

审查元素的时候不会被看到注释掉的内容

①单行注释

  1. {# 被注释掉的内容 #}

②多行注释

  1. {% comment %}
  2. 内容
  3. {% endcomment %}

4、ifequal

判断是否相等

  1. {% ifequal value1 value2 %}
  2. 语句
  3. {% endifequal %}

5、ifnotequal

判断是否不等

  1. {% ifnotequal value1 value2 %}
  2. 语句
  3. {% endifequal %}

6、include标签

include标签常用来包含那些固定不变的模板

语法:

​ {% include '包含的模板地址' %}

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>主页</title>
  6. </head>
  7. <body>
  8. <h3>欢迎访问本网站</h3>
  9. {% include 'tags/footer.html' %}
  10. </body>
  11. </html>
  1. 友情链接:<a href="http://www.baidu.com">百度</a>
  2. <a href="http://www.souhu.com">搜狐</a>
  3. <a href="http://www.360.com">360</a><br>
  4. 联系电话:158XXXXXXX

7、模板继承标签

①、挖坑和填坑

父模板(基模板)提前定义若干个block块标签,子模板可以继承、重写、添加父模板block块中的内容。​

"挖坑, 填坑"可以嵌套,坑不是必须填的,没有填的坑,在html中自动过滤

  1. {%block name%}
  2. {%endblock%}

②、模板继承

子模板通过{% extends '父模板位置' %}继承父模板。​​

子模板如果想要在父模板的某个块中添加内容,则先要使用{{ block.super }}获取​ 父模板中该块的内容。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{% block title %}{% endblock %}</title>
  6. </head>
  7. <body>
  8. <h3>西安欢迎你</h3>
  9. {% block content %}
  10. <h3> 西安是一座现代化城市</h3>
  11. {{ msg }}
  12. {% endblock %}
  13. </body>
  14. </html>
  1. {% extends 'extends/base.html' %}
  2. {% block title %}
  3. 大秦帝国
  4. {% endblock %}
  5. {% block content %}
  6. {{ block.super }}
  7. <h3>大秦将要统一六国</h3>
  8.  
  9. {{ info }}
  10. {% endblock %}
  1. def go_child(request):
  2. return render(request,'child.html',{'info':'西安市十三朝古都','msg':'这是父模板的信息'})

【注意:子模块中只能填坑,在子模块中自己添加的东西,并不会显示在页面上】

四、过滤器|

1、作用

在变量显示前修改它的值

2、使用方法

模板变量后面添加管道符 | ,管道符后面是过滤器名称,可以连用,过滤器之间使用|隔开

3、常用的模板过滤器

①算术运算

(1)加减  add,通过加上负数的形式实现减法

  1. {{ store.years|add:5 }}
  2. {{ store.years|add:-2 }}

(2)乘除  {% widthratio 变量  分母  分子  %}

  1. {% widthratio price 10 1 %} price = 1000时,结果为100
  2. {% widthratio 100 10 5%} 100的十分之五

(3)整除  {% if  num|divisibleby:2 %}

  1. {% if forloop.counter|divisibleby:2 %}

②、字符串操作

(1)lower 变为小写

  1. {{ p.pname|lower }}

(2)upper 变为大写

  1. {{ p.pname|upper }}

(3)capfirst  第一个字符转化成大写形式

  1. {{ value | capfirst }}

(4)cut   从给定value中删除所有arg的值

  1. {{ value | cut:arg}}

(5)truncatewords:"单词数" 截取指定数量的单词,该过滤器需要参数

(6)truncatechars:'字符数',截取指定数量的字符,当数量<=3 时显示... 当数量>3时,后三位显示为...前面的正常显示

③、default默认值

格式: {{var|default:value}}

  1. {{ store.address|default:'无' }}

④、日期时间

根据指定格式转换日期为字符串

格式:{{  dateVal | date:'Y-m-d H:i:s a' }}

⑤、HTML转义

将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题

渲染成html

  1. {{ code|safe}}
  2. {% autoescape off%}
  3. code
  4. {% endautoescape %}

不渲染

  1. {{ code|escape}}
  2. {% autoescape on%}
  3. code
  4. {% endautoescape %}

注意:开发中尽量保持纯文本,如果进行html渲染, 可能会被恶意注入

⑥其他

(1)filesizeformat

  1. {{ value | filesizeformat }}

格式化value,使其成为易读的文件大小,例如:13KB,4.1MB等。

(2)dictsort

  1. {{ value | dictsort:"name"}}

如果value的值是一个字典,那么返回值是按照关键字排序的结果

(3)dictsortreversed

同dictsort, 按照关键字排序的结果的反序

(4)first

返回列表中的第一个Item

  1. {{ value | first }}

(5)last

返回列表中的最后一个Item

  1. {{ value | last }}

(6)length

  1. {{ value | length }}

返回value的长度

(7)addslashes

在单引号、双引号、反斜线前添加斜线

  1. def show_filter(request):
  2. s = 'hello django, hello python'
  3. num = 100
  4. say = "He said:'you are stupid!'"
  5. t = datetime.now()
  6. info = '<li>我是一条info信息</li>'
  7.  
  8. return render(request, 'filter/filter_demo.html', locals())
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>演示模板过滤器</title>
  6. </head>
  7. <body>
  8. <h3>s|length 传递的字符串s的长度{{ s|length }}</h3>
  9. <h3>s|capfirst 传递的字符串s的首字母大写{{ s|capfirst }}</h3>
  10. <h3>s|first|upper 连续调用过滤器,获取s首字母大写{{ s|first|upper}}</h3>
  11. <h3>s|truncatechars:"" 选取s前三个字符{{ s|truncatechars:""}}</h3>
  12. <h3>s|truncatewords:"" 选取s前1个单词{{ s|truncatewords:""}}</h3>
  13. <h3>s|truncatewords:"" 选取s前2个单词{{ s|truncatewords:""}}</h3>
  14. <h3>t|date:"Y-m-d H:i:s" 当前时间{{ t|date:"Y-m-d H:i:s"}}</h3>
  15. <h3>t|addslashes addslashes过滤器{{ say|addslashes}}</h3>
  16. <h3>num|add:'' 给变量添加5:{{ num|add:'' }}</h3>
  17. <hr>
  18. <h3>info 未加safe过滤器{{ info }}</h3>
  19. <h3>info|safe 添加safe过滤器{{ info|safe }}</h3>
  20. 添加safe后,浏览器会解析其中的标签信息
  21. <hr>
  22.  
  23. </body>
  24. </html>

4.自定义过滤器

①步骤

a.在应用目录下建立templatetags包(最好创建__init__.py文件),并在此包下建立自己的过滤器模块(例如:myfilter.py)

b.在自定义模块中导入template包:from django import template

c.创建过滤器装饰变量:register = template.Liabry()

d.使用装饰器装饰函数,装饰语句为:@register.filter

e.在模板中加载过滤器模块

②举例

现在有需求,在url中传递阿拉伯数字,在页面中显示其对应的大写汉字

  1. # 定义过滤器
  2. # myapp/templatetags/myfilter.py
  3.  
  4. from django import template
  5.  
  6. # 用来注册模板过滤器
  7. register = template.Library()
  8.  
  9. # name属性可以给函数添加别名,不设置name属性的话在模板中可以直接使用函数名访问
  10. # value为形参,为模板变量,模板页面中变量通过第一个形参和过滤器交互
  11. # s为模板中的参数【非必须,在模板函数可以使用 函数名或别名:变量值 来进行参数传递】
  12. @register.filter(name='chinese_upper')
  13. def number_to_upper(value, s):
  14. list1 = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾', '佰']
  15. return list1[value] + s
  1. # 路由中添加
  2. path('custom_filter/<int:num>/', views.show_custom_filter),
  1. # 视图函数中添加
  2. def show_custom_filter(request, num):
  3. try:
  4. return render(request, 'filter/custom_filter.html', locals())
  5. except:
  6. return HttpResponse('Index Error')
  1. <!--模板页面-->
  2. <!--myapp.templates.filter.custom_filter.html-->
  3.  
  4. <!DOCTYPE html>
  5. {% load myfilter %}
  6. <html lang="en">
  7. <head>
  8. <meta charset="UTF-8">
  9. <title>自定义过滤器</title>
  10. </head>
  11. <body>
  12. {{ num | chinese_upper:"China No.1" }}
  13. </body>
  14. </html>

五、csrf

1、作用

防止跨站请求伪造,某些恶意网站包含链接js利用登陆用户在浏览器中的认证信息,进行非法操作、攻击服务、破坏数据等

2、token

一种口令,通常被用于验证身份

生成规则:保证生成的数据是唯一的,例如:用户唯一, 拼接时间戳, 拼接公司域名(工程名)

     最后使用md5(摘要)(本质: 128位的2进制,转换成32个16进制, 即四个一组,将16进制转换成字符串,不管输入有多少, 输出都是定长的)

3、使用中间件csrf_token

增加系统的安全性,在请求头的cookie中生成了一个csrftoken键值对

4、在<form>表单中

使用post提交

  1. {% csrf_token %}

5、settings配置

默认情况下django中是启动了csrf_token认证的,在settings中的中间件MIDDLEWARE中配置打开'django.middleware.csrf.CsrfViewMiddleware',

不想使用的时候: 在settings中的MIDDLEWARE中注释或删除

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

  1. django的模板(二)

    模板(二) 实验简介 本节继续介绍模板的常用标签,for.if.ifequal和注释标签. 一.基本的模板标签和过滤器 1. 标签 if/else {% if %} 标签检查(evaluate)一个变 ...

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

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

  3. Django的模板系统

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

  4. Django的模板层

    一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...

  5. Django之模板1

    Django模板 一.变量(只需要记住两种特殊符号) {{ }} 和{% %} {{ }}表示变量,在模板渲染的时候替换成值,变量名由字母数字和下划线组成. {% %}表示逻辑相关的操作. 点(.)在 ...

  6. python 全栈开发,Day69(Django的视图层,Django的模板层)

    昨日内容回顾 相关命令: 1 创建项目 django-admin startproject 项目名称 2 创建应用 python manage.py startapp app名称 3 启动项目 pyt ...

  7. Django框架----模板语法

    Django模板系统 官方文档 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 只需要记两种特殊符号: {{  }}和 {% %} 变量 ...

  8. Django之模板语法

    Django框架之第三篇模板语法(重要!!!) 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 一.模板语法之变量:语法为 {{ }}: ...

  9. Django框架-模板系统

    来看一段代码 def current_datetime(request): now = datetime.datetime.now() html = "<html><bod ...

随机推荐

  1. windows环境安装rabbitmq

    (1)下载并安装 Eralng 如:otp_win64_20.2.exe (以管理员身份运行安装) (2)下载并安装rabbitmq 如:rabbitmq-server-3.7.4.exe.双击安装, ...

  2. 201671010459 张旭辉 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 作业学习目标 (1)掌握软件项目评审会流程(2)反思总结课程学习内容 github仓库地址链接 [Git ...

  3. JDBC连接池的九种查询

    package JDBC_Demo; import java.sql.SQLException; import java.util.List; import java.util.Map; import ...

  4. IDEA控制台输出中文乱码问题

    IntelliJ IDEA 真的是一款很方便的Java开发工具,但是关于中文乱码这个问题我不得不吐槽,这个编码也弄得这么麻烦干嘛,真想找idea开发者干架,我敢打包票我能在一分钟之内一拳飞过去让他跪下 ...

  5. XIX Open Cup named after E.V. Pankratiev. Grand Prix of Eurasia, Division 1.

    A 签到. C 源点向每个软件连边.把每个软件拆成对应版本数个点,每个软件向版本连边.把每个conflict也看成一个点.每个版本向它对应的conflict连边,conflict向汇点连边.没有在co ...

  6. JQuery$.extend()用法

    1.合并多个对象. <span style="font-size:18px;">//用法: jQuery.extend(obj1,obj2,obj3,..) var C ...

  7. 第05组 Beta冲刺(3/4)

    第05组 Beta冲刺(3/4) 队名:天码行空 组长博客连接 作业博客连接 团队燃尽图(共享): GitHub当日代码/文档签入记录展示(共享): 组员情况: 组员1:卢欢(组长) 过去两天完成了哪 ...

  8. java 构造实例

    Person父类 package com.oracle.demo03; public class Person { private String name; private int age; //需要 ...

  9. 几款不错的java表达式引擎

    mvel 比较老牌了,很强大,但是好久没更新了 参考地址: http://mvel.documentnode.com/ https://github.com/mvel/mvel ScriptEngin ...

  10. E437: terminal capability "cm" required 解决办法

    E437: terminal capability "cm" required 这个错误一般是环境变量TERM没有配置或者配置错误所致. 解决办法: 执行export TERM=x ...