Django老男孩笔记进阶
Django的模板系统
-
主要记住两种语法
{{ }}
和{% %}
变量相关的用{{}}, 逻辑相关的用{% %}
示例:
变量
- {{ name }} 变量
for循环:
{% for i in book_list %}
{{forloop.counter}}
{{forloop.last}}
{{i}}
{% endfor %}
if判断
{% if 10 > 5 %}
{% else %}
{% endif %}
if ... in 判断
{% if name in name_list %}
{% endif %}
变量
当模板语言中遇到一个变量的时候,它会先去计算这个变量的值,如果有值,就用这个值代替原来的变量,如果这个值不存在,就不显示.
模板语言中.具有特殊的含义,当系统遇到.的时候会按照如下的顺序查询
- 1.字典查询
- 2.属性或者方法查询
- 3.数字索引查询
注意: 如果计算结果是一个方法,可以调用的,它将作为一个无参数来调用.调用的结果将作为模板的值.如果使用的变量不存在,模板系统将用空字符串来代替
filter(过滤器)
语法: {{value|filter_name:参数}}
-
default
如果一个变量是false或者为空,则使用给定的默认值,否则,使用变量的值
{{ value|default:"nothing" }}
如果value没有传值或者值为空的话就显示nothing
-
filesizeformat
将值格式化为一个人类可读的文件尺寸(例如 '13kb','4.1 MB',默认原来的单位是字节)
<p>文件大小: {{ file_size|filesizeformat }}</p>
-
length
返回值的长度,作用于字符串和列表
返回value的长度,如果是value=['a','b','c','d']的话就显示4
-
slice
切片 类似于python的列表和字符串切片,只是写法不同,这里使用字单引号包起来,中间用分号分割.
<p>切片: {{ name_list|slice:"1:-1" }}</p>
<p>切片: {{ name|slice:"0:-1" }}</p>
-
date
格式化
{{ value|date: "Y-m-d H:i:s "}}
<p>时间: {{ now|date:"Y-m-d H:i:s" }}</p>
经过格式化后就变成下面这样
-
safe
Django模板中默认会对是HTML标签和JS语法的标签进行字段转义,将其当成字符串显示到页面上.这样做的原因显而易见,
是为了安全,但是有时候我们自己写代码的时候,也许需要自己添加一些标签或者js代码,这个时候,希望解除这种转义,让其把我们写的字符串当成是html标签或者是js,这个时候就可以使用value|safe的方法
如果没有使用safe,页面是这么显示的
<p>标签显示: </p>{{ html_str }}
当成了一个字符串显示到页面上.
如果使用了safe,则会当成一个标签嵌入到当前页面
<p>标签显示:</p>{{ html_str|safe }}
-
truncatechars
如果字符串字符多于指定的字符数量,那么会被截断.截断的字符串将以可翻译的省略号序列('....')结尾
参数,要截取的字符串的长度
<p>截断的字符串:{{ truncate_chars|truncatechars:9 }}</p>
-
自定义filter
自定义过滤器的使用步骤
1. 首先是在app中创建一个模块名字叫templatetags,然后建立一个存放自定义的filter的文件
2. 然后在自己创建的.py文件中,定义并注册自己定义的想要使用的filter
使用我们自定义的filter
{% load app01_filters %}
<p>自定义filter的使用: {{ name|sb }} {{ name|addstr:'第二个参数加起' }}</p>
注意, 这里加载模板的时候必须先重新启动项目,不然找不到对应的模块
for 循环
-
for 循环可以使用的一些参数
-
for ... empty
当for循环没有任何数据的时候,需要显示的内容可以写到empty的后面.
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% empty %}
<li>空空如也</li>
{% endfor %}
</ul>
if 判断
with
csrf_token
注意
母版
母版和继承
- 为什么要有模板和继承:
把多个页面公用的部分提取出来,放在一个母版里面.其他的页面只需要继承母版就可以了. - 具体的使用步骤:
1> 把公用的HTML部分提取出来,刚到base.html文件中,其他的页面只需要继承母版就可以了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
{% block page-css %}
{% endblock %}
</head>
<body>
<h1>这是母板的标题</h1>
{% block page-main %}
{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}
{% endblock %}
</body>
</html>
组件 include
静态文件相关
simple_tag
和自定义的filter类似,但是它可以接受任意个参数,并且它在使用的时候并不需要使用管道符.
1. 在templatetags下创建一个py文件simple_tag.py,然后在里面定义一个函数,并注册
2. 使用的时候,也是先加载
inclusion_tag
多用于返回html代码片段
Django的视图系统
视图的作用:
接受web请求并且返回web响应
无论视图本身包含什么逻辑,都要返回响应.我们一般约定视图写到对应的app的views.py中
FBV 和 CBV
Request对象和Response对象
当一个页面被请求的时候,Django会创建一个包含本次请求的信息的HttpRequest对象.
Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用request参数来接收这个对象.
Request 对象
上传文件
对应的html写法
上传文件的逻辑,注意使用的是chunks()
Response对象
httpResponse的使用
JsonResponse
JsonResponse是HttpResponse的子类
使用JsonResponse代替原来的json.dumps()
如何使用JsonResponse处理非字典的数据类型呢?
路由系统
Django的路由系统的概述
URL配置(URLconf)就像是Django所创建的网站的目录.它本质上是URL和该URL要调用的视图函数之间的映射表
Djang就是用这种方式告诉程序,对于这个URL调用这段代码,对于那个URL调用那段代码.
正则表达式详解