python全栈开发day64-模板-变量和(.)的使用,filters和自定义filter
一、上周内容回顾
day64
内容回顾:
1. 所有的django命令
1. 安装
pip install django==1.11.14
pip install -i 源 django==1.11.14
2. 创建项目
django-admin startproject 项目名称
3. 启动项目
python manage.py runserver 127.0.0.1:8000
python manage.py runserver 80 127.0.0.1:80
python manage.py runserver 0.0.0.0:80 0.0.0.0:80
4. 创建APP
python manage.py startapp app01
5. 数据库迁移
Python manage.py makemigrations # 将models的变化记录下来
python manage.py migrate # 将变更更新到数据库当中 2. 配置
1. 静态文件
STIATIC_URL = '/static/' # 别名
STIATICFILES_DIRS = [
os.path.join(BASE_DIR,'static'),
]
2. 注释csrf中间件
3. TEMPLATES DIRS os.path.join(BASE_DIR,'teamplates')
4. DATABASES
5. INSTALLED_APPS =[
'app01' 或者 'app01.apps.App01Config'
]
3. ORM类和数据库对应关系
类 ——》 数据表
对象 ——》 数据行
属性 ——》 字段
4. django使用mysql数据的流程
1. 创建mysql的数据库
2. 配置
ENGINE: mysql
NAME: 数据库名字
HOST: ip地址
PORT:3306
USER: 用户名
PASSWORD: 密码
3. 告诉django使用pymysql模块连接你的mysql数据库
在与项目同名文件夹下的__init__.py文件写:
import pymysql
pymysql.install_as_MySQLdb()
4. 在app01下的models.py中写类(必须继承models.Model):
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, null=False, unique=True)
addr = models.CharField(max_length=128, null=False) def __str__(self):
return "< Publisher object: {}>".format(self.name) class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32, null=False, unique=True)
publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE) def __str__(self):
return "< Publisher object: {}>".format(self.title) class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32, null=False, unique=True)
books = models.ManyToManyField(to='Book') 5. 执行数据库迁移的命令
Python manage.py makemigrations
python manage.py migrate
5.ORM操作
1. 查
models.Publisher.objects.all() # 查询所有的出版社对象的集合
models.Publisher.objects.get(id=1,nam='sss) # 查询指定的满足条件的对象 ——》一个对象
models.Publisher.objects.filter(id=1,name='sss') # 查询满足条件的所有对象 ——》 对象列表
models.Publisher.objects.all().order_by('id') # 排序 属性:
无外键、多对多:
pub_obj.id
pub_obj.name
外键:
book_obj.id
book_obj.name
book_obj.publisher ——》book所关联的出版社对象
book_obj.publisher.id
book_obj.publisher_id
多对多:
author_obj.id
author_obj.name
author_obj.books ——》django封装的管理对象
author_obj.books.all() ——》 拿到作者管理的所有书籍的对象列表
2. 增
models.Publisher.objects.create(name='新的出版社')
外键:
models.Bookj.objects.create(name='新的书名',publisher_id=1)
models.Bookj.objects.create(name='新的书名',publisher=pub_obj)
多对多:
autho_obj = models.Author.objects.create(name='新的作者')
autho_obj.books.set([1,2]) 3. 删
models.Publisher.objects.get(id=1).delele()
models.Publisher.objects.filter(name='xxx').delele()
4. 改
pub_obj.name = '新的名字'
pub_obj.save() 外键:
book_obj.name = '新的书名'
book_obj.publisher = pub_obj
# book_obj.publisher_id = pub_obj.id
book_obj.save() 多对多:
author_obj.name='新的作者名'
author_obj.save()
author_obj.books.set([1,2,3]) 6. request ——》 封装了请求所有的内容
request.method ——》请求方式 GET POST
request.GET ——》 URL上面传参数 127.0.0.1:8000/del_book/?id=1&name='xx'
字典形式 request.GET['id'] request.GET.get('id')
request.POST ——》POST请求提交的数据 字典
request.POST['id'] request.POST.get('id') 7. 函数的返回值 ——》必须是HttpResponse对象
HttpResponse('字符串') ——》页面显示字符串的内容
render(request,'HTML文件名',{k1:v1,}) ——》将字典的内容交给模板渲染成HTML 返回给浏览器
redirect('/index/') 跳转 重定向 ——》返回一个响应头 Location:/index/ 1.今日内容:
1. django的模板:
1. 已经学的内容:
{{ 变量 }}
for 循环
{% for name in name_list %}
{{ name }}
{{ forloop.counter }}
{{ forloop.last }}
{% endfor %} if判断
{% if 10>5 %}
操作
{% endif %} {% if 10>5 %}
操作
{% else %}
条件不成立的操作
{% endif %} {% if 10>5 %}
操作
{% elif 10>5 %}
elif成立时的操作
{% else %}
条件不成立的操作
{% endif %}
2. 今天新的内容
1. 变量及(.)的使用
2. filters
3. 自定义filter
上周内容回顾
二、今日内容总结
1.变量和(.)的使用:
1) Django模板中两种特殊符号:
{{}} 和{%%} # 变量和标签
2) 变量
变量名由字母数字和下划线组成。
3) 点(.)
用来获取对象的相应属性值。
li.0 #取列表中的值
dic.key #取字典中的key对象的value
obj.name #取对象的属性值
li.0.name
obj.read #取对象的方法,只能调用不带参数或参数有默认值的方法
4) 当模板系统遇到一个(.)时,会按照如下的顺序去查询
1.在字典中查询 2.属性或者方法 3.数字索引
2.filters
过滤器,用来修改变量的显示结果。
语法:{{value|filter_name:参数}}
‘|’左右没有空格
1)、default (不管有没有定义)
{{value|default:‘nothing’}}
如果value值没传的话就显示nothing
TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。 # 这个是指没有定义的,会优先于default执行,但是对于那些已定义的但是值为'',[],{}....会显示default或为空。
<p>{{ add|add:''|default:'你错了!' }}</p>
<p>{{ djsdjfjds|default:'没有值' }}</p>
<p>{{ string|default:'值为空' }}</p> 40 没定义 值为空
2)、filesizeformat
{{ value|filesizeformat }}
3)、 add 给变量加参数
{{value|add:'2'}}
a.value值和add参数均为字符串形式,如都为整数则相加,如有一个不为整数则字符串拼接
b.value值和add参数一个字符串,一个整数,value形式为整数或浮点型都能正常加运算,add参数不为整数则报错
c.都为整数形式则运算值取整后进行加运算,非四舍五入
4)、lower,upper、title
5)、ljust、rjust、center #
{{value|ljust:'20'}}
{{value|center:'20'}}
6)、length
7)、slice
{{value|slice:'1:10:2'}}
8)、first 、last、join、truncatechars
{{value|first}}
{{value|join:'++'}}
{{value|truncatechars:9}}
9)、 date
日期格式化
{{ value|date:"Y-m-d H:i:s"}}
默认格式化设置:
引用方式变为:
<p>{{ date_test|date}}</p>
10)、safe
{{ value|safe}}
过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
3.自定义filter
1)定义五步
2)引用两步
3) 自定义过滤器取别名
4) 注意两个名字不能改:
记下来,省得每次google 过滤器,变量的显示形式的改变 一、形式:小写 {{ name | lower }} 二、串联:先转义文本到HTML,再转换每行到 <p> 标签 {{ my_text|escape|linebreaks }} 三、过滤器的参数 显示前30个字
{{ bio | truncatewords:"" }} 格式化
{{ pub_date | date:"F j, Y" }} 过滤器列表 {{ 123|add:"" }} 给value加上一个数值 {{ "AB'CD"|addslashes }} 单引号加上转义号,一般用于输出到javascript中 {{ "abcd"|capfirst }} 第一个字母大写 {{ "abcd"|center:"" }} 输出指定长度的字符串,并把值对中 {{ "123spam456spam789"|cut:"spam" }} 查找删除指定字符串
{{ value|date:"F j, Y" }} 格式化日期 {{ value|default:"(N/A)" }} 值不存在,使用指定值 {{ value|default_if_none:"(N/A)" }} 值是None,使用指定值 {{ 列表变量|dictsort:"数字" }} 排序从小到大 {{ 列表变量|dictsortreversed:"数字" }} 排序从大到小 {% if 92|divisibleby:"" %} 判断是否整除指定数字 {{ string|escape }} 转换为html实体 {{ 21984124|filesizeformat }} 以1024为基数,计算最大值,保留1位小数,增加可读性 {{ list|first }} 返回列表第一个元素 {{ "ik23hr&jqwh"|fix_ampersands }} &转为& {{ 13.414121241|floatformat }} 保留1位小数,可为负数,几种形式 {{ 13.414121241|floatformat:"" }} 保留2位小数 {{ 23456 |get_digit:"" }} 从个位数开始截取指定位置的1个数字 {{ list|join:", " }} 用指定分隔符连接列表 {{ list|length }} 返回列表个数 {% if 列表|length_is:"" %} 列表个数是否指定数值 {{ "ABCD"|linebreaks }} 用新行用<p> 、 <br /> 标记包裹 {{ "ABCD"|linebreaksbr }} 用新行用<br /> 标记包裹 {{ 变量|linenumbers }} 为变量中每一行加上行号 {{ "abcd"|ljust:"" }} 把字符串在指定宽度中对左,其它用空格填充 {{ "ABCD"|lower }} 小写 {% for i in "1abc1"|make_list %}ABCDE,{% endfor %} 把字符串或数字的字符个数作为一个列表 {{ "abcdefghijklmnopqrstuvwxyz"|phone2numeric }} 把字符转为可以对应的数字?? {{ 列表或数字|pluralize }} 单词的复数形式,如列表字符串个数大于1,返回s,否则返回空串 {{ 列表或数字|pluralize:"es" }} 指定es {{ 列表或数字|pluralize:"y,ies" }} 指定ies替换为y {{ object|pprint }} 显示一个对象的值 {{ 列表|random }} 返回列表的随机一项 {{ string|removetags:"br p div" }} 删除字符串中指定html标记 {{ string|rjust:"" }} 把字符串在指定宽度中对右,其它用空格填充 {{ 列表|slice:":2" }} 切片 {{ string|slugify }} 字符串中留下减号和下划线,其它符号删除,空格用减号替换 {{ 3|stringformat:"02i" }} 字符串格式,使用Python的字符串格式语法 {{ "E<A>A</A>B<C>C</C>D"|striptags }} 剥去[X]HTML语法标记 {{ 时间变量|time:"P" }} 日期的时间部分格式 {{ datetime|timesince }} 给定日期到现在过去了多少时间
{{ datetime|timesince:"other_datetime" }} 两日期间过去了多少时间 {{ datetime|timeuntil }} 给定日期到现在过去了多少时间,与上面的区别在于2日期的前后位置。 {{ datetime|timeuntil:"other_datetime" }} 两日期间过去了多少时间
{{ "abdsadf"|title }} 首字母大写 {{ "A B C D E F"|truncatewords:"" }} 截取指定个数的单词 {{ "<a>1<a>1<a>1</a></a></a>22<a>1</a>"|truncatewords_html:"" }} 截取指定个数的html标记,并补完整 <ul>{{ list|unordered_list }}</ul> 多重嵌套列表展现为html的无序列表
{{ string|upper }} 全部大写 <a href="{{ link|urlencode }}">linkage</a> url编码 {{ string|urlize }} 将URLs由纯文本变为可点击的链接。(没有实验成功)
{{ string|urlizetrunc:"" }} 同上,多个截取字符数。(同样没有实验成功) {{ "B C D E F"|wordcount }} 单词数 {{ "a b c d e f g h i j k"|wordwrap:"" }} 每指定数量的字符就插入回车符
{{ boolean|yesno:"Yes,No,Perhaps" }} 对三种值的返回字符串,对应是 非空,空,None
Django模板系统——过滤器
python全栈开发day64-模板-变量和(.)的使用,filters和自定义filter的更多相关文章
- Python全栈开发【面向对象】
Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...
- python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)
昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...
- python全栈开发学习_内容目录及链接
python全栈开发学习_day1_计算机五大组成部分及操作系统 python全栈开发学习_day2_语言种类及变量 python全栈开发_day3_数据类型,输入输出及运算符 python全栈开发_ ...
- Python全栈开发【模块】
Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...
- Python全栈开发【基础四】
Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...
- Python全栈开发【基础三】
Python全栈开发[基础三] 本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...
- Python全栈开发【基础二】
Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 其他(编码,range,f ...
- Python全栈开发【基础一】
Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与wh ...
- Python全栈开发
Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“ ...
随机推荐
- tomcat apr 部署
背景 这还是为了高并发的事,网上说的天花乱坠的,加了apr怎么怎么好,我加了,扯淡.就是吹牛用.我还是认为,性能问题要考设计逻辑和代码解决,这些都是锦上添花的. 步骤 1 windows 部署简单,虽 ...
- <TCP/IP>地址解析协议ARP
从前两章中有学到,网络层地址和链路层地址是由不同的,一个是物理地址,一个是IP地址.物理地址固定存储在网卡中,不会改变,而IP地址是可以网络管理员和用户自己分配的 在传统的IPv4网络中,一台A主机要 ...
- Ionic-轮播图ion-slide-box
官方用法介绍:http://www.ionic.wang/js_doc-index-id-44.html 用法 <ion-slide-box> <ion-slide> < ...
- heidiSQL使用简介
2017年12月5日09:49:42 星期二 HeidiSQL下载链接 1. 这个是免费的, 不用辛苦找破解码了, 也不用担心被破解软件装后门 2. 可以一次执行多条SQL语句分开选项卡显示 3. 可 ...
- ubuntu 精简配置
是这样的情况,在windows 7的vm虚拟机上装了Ubuntu 12.04 Desktop,主要是想用它的gui, 所以把不要的给删了. sudo apt-get -y --auto-remove ...
- Redis的安装、配置及测试
Redis下载地址 https://github.com/MicrosoftArchive/redis/releases(如果需要安装windows服务版本,需要下载msi格式) 或 https:// ...
- Eclipse中避免修改后台代码后手动install和重启
之前每次修改maven多模块项目后都得重新执行mvn install ,install完还得重启jetty/tomcat服务器,非常浪费 时间,其实修改代码后可以不用执行install,也不用 ...
- Android 获取keystore SHA1方法
(第一种方式)通过Android Studio编译器获取SHA1 第一步.打开Android Studio的Terminal工具 第二步.输入命令:keytool -v -list -keystore ...
- spring、springMVC、mybatis配置文件
一.jdbc.properties 文件: driver=com.mysql.jdbc.Driverurl=jdbc:mysql://192.168.31.xxx:3306/abc?useUnicod ...
- swift 学习- 17 -- 析构器
// 析构器 只适用与 类类型, 当一个类的实例被释放之前, 析构器会被立即调用, 析构器用关键字 deinit 来标示, 类似于构造器要用 init 来标示 // 析构过程原理 // Swift 会 ...