• for循环---表格
views
def index(request):
context={
'books':[
{'name':'xiyouji','author':'k','price':99},
{'name':'hongloumeng','author':'j','price':90},
{'name':'shuihuzhuan','author':'a','price':106},
{'name':'sanguoyanyi','author':'b','price':112},
],
'person':{
'username':'Jim Green',
'age':20,
'sex':'man'
}
}
return render(request,'index.html',context=context)
html
......
bookname | # 表头author | # 表格的基本格式就是这样price |
{{ book.name }} | {{ book.author }} | {{ book.price }} |
效果:
bookname author price
xiyouji k 99
hongloumeng j 90
shuihuzhuan a 106
sanguoyanyi b 112
• forloop.counter---返回数值(循环的次数,从1开始,只能用于for循环)
forloop.counter0---从0开始计数
forloop.recounter---counter的倒序(比如counter是1-4,那么recounter就是4-1)
forloop.recounter0---倒序末位数是0
示例:
html
......
number | # 添加计数bookname | author | price |
{{ forloop.counter }} | # forloop.counter计数{{ book.name }} | {{ book.author }} | {{ book.price }} |
效果:
number bookname author price
1 xiyouji k 99
2 hongloumeng j 90
3 shuihuzhuan a 106
4 sanguoyanyi b 112
• forloop.first/last---对应 第一次/最后一次 循环
下述示例,对表格的第一行和最后一行渲染颜色:
number
bookname
author
price
{% for book in books %}
{% if forloop.first %} # 第一次循环,渲染样式
{% elif forloop.last %} # 最后一次循环,渲染样式
{% else %}
# 如果不是第一次/最后一次,那么就返回普通标签
{% endif %}
{{ forloop.counter }}
{{ book.name }}
{{ book.author }}
{{ book.price }}
# 这个结束标签不能遗漏
{% endfor %}
看效果,成功渲染
• for...empty...示例:
views
from django.shortcuts import render
from django.template.loader import render_to_string
from django.http import HttpResponse
def index(request):
context={
'books':[
{'name':'sanguoyanyi','author':'shianang','price':100},
{'name':'shuihuzhuan','author':'luoguanz','price':120},
{'name':'hongloumeng','author':'caoxueqing','price':180},
{'name':'xiyouji','author':'wuchengen','price':200},
],
'person':{
'name':'Kate Green',
'age':18,
'sex':'woman',
},
'comments':[], # 这里只有为空,才会显示template的'There is no comment',值为None或者''都不行
}
#return render(request,'index.html',context=dict(person=p))
return render(request,'index.html',context=context)
{% for comment in comments %}
{{ comment }}
{% empty %}
There is no any comment.
{% endfor %}
• with用法:定义模板变量
<1>基础用法示例:
views
def index(request):
context={
......
'persons':[
'Jim Green',
'Kate Green',
'Li Lei',
'Han meimei',
],
}
return render(request,'index.html',context=context)
html
......
{{ persons.0 }}
# 使用这种定义,显示'Jim Green'{{ persons.0 }}
{{ persons.0 }}
现在换一种写法:
{% with name1=persons.0 %} # with相当于js的var,注意等号两边不能使用空格,否则语法错误
{{ name1 }}
# 显示'Jim Green'{{ name1 }}
{{ name1 }}
{% endwith %}
<2>使用as命名变量:
上述示例稍微调整一下:
{% with persons.0 as name1 %}
{{ name1 }}
# 显示'Jim Green'{{ name1 }}
{{ name1 }}
{% endwith %}
小结:具体使用哪种语法,看个人,我偏向于使用as;
使用with定义的变量,一旦范围超出'endwith',变量就失效了,这点要注意.
•spaceless标签:去除多余的空格,换行
示例:
{% spaceless %}
{% endspaceless %}
渲染后的效果(使用谷歌浏览器的'Sources'选项,而不是用'Elements'查看):
● 自动转义:django默认自动转义
示例:
views
def index(request):
context={
......
'info':"百度链接" # 注意这里的链接,只能用字符串来表示.
}
return render(request,'index.html',context=context)
html
{{ info }} # 效果:百度链接
源码:百度链接 # 引号,破折号全被转义
现在,使用{% autoescape %}标签关闭/开启自动转义
html
{% autoescape off %}
{{ info }}
{% endautoescape %}
效果:成功实现链接的操作,而不会被转义成普通字符串.
• verbatim标签:包含在里面的'变量',不再表示'变量',它的作用就是可以和别的模板引擎混合使用
也就是说,可以把别的模板引擎语言,写在里面.
示例:
{% verbatim %}
{{ var }}
{% endverbatim %}
● url标签:反转网址,效果和view的reverse一样
示例:
html
views
def book(request):
return HttpResponse('读书页')
def movie(request):
return HttpResponse('电影页')
def city(request):
return HttpResponse('同城页')
urls
from django.contrib import admin
from django.urls import path
from front import views
urlpatterns = [
path('admin/', admin.site.urls),
path('',views.index),
path('book/',views.book,name='book'),
path('movie/',views.movie,name='movie'),
path('city/',views.city,name='city'),
]
启动服务,看看基本的效果,正常.
现在修改html文档,添加标签链接:
刷新一下,成功实现效果
• url标签接收url额外的参数示例:
views
...
def book_number(request,number):
text='The number of book_id is {}'.format(number)
return HttpResponse(text)
urls
...
path('book_detail/
html
刷新效果,网址成功跳转
• url 查询字符串拼接(和reverse类似,也是采用拼接的方式)
示例:
views
def login(request):
keyword=request.GET.get('next')
if keyword:
text='登陆后跳转的url是{}'.format(keyword)
else:
text='next为空'
return HttpResponse(text)
urls
......
path('login/',views.login,name='login'),
html
访问:http://127.0.0.1:8000/,点击'登陆'
跳转到:http://127.0.0.1:8000/login/?next= 网页显示'next为空'
现在给next赋值:登陆
跳转到:http://127.0.0.1:8000/login/?next=%E7%94%A8%E6%88%B7%E7%9A%84url,网页显示'登陆后跳转的url是用户的url'
复习之前的reverse()手动拼接url
def name(request):
query_string=request.GET.get('name')
if query_string:
text='Your name is {}'.format(query_string)
# 此时,若想获取当前url,只能手动拼接...
local_url=reverse('name')+'?name={}'.format(query_string) # /name/?name=JimGreen
print(local_url)
else:
text='Nothing'
return HttpResponse(text)
● DTL过滤器(函数)
• add过滤器:对传进来的值,进行'相加'或'拼接'操作
示例:
views
def index(request):
context={
'value':100 # 值为整型
}
return render(request,'index.html',context=context)
html
{{ value|add:200 }}
# 结果为300源码:
def add(value, arg): # 接收的第一个参数是value
"""Add the arg to the value."""
try:
return int(value) + int(arg) # 优先进行整型计算
except (ValueError, TypeError):
try:
return value + arg # 否则就进行拼接
except Exception: # 如果拼接不成功,就返回空字符串
return ''
• cut过滤器:移除字符串中指定的值,类似于replace(args,' ')
示例:
views
def index(request):
context={
'value':'Jim Green',
}
html
{{ value|cut:' ' }}
# JimGreen• date过滤器:须传入datetime对象,再date转换成时间格式(具体的格式视需求而定)
示例:
views
from django.http import HttpResponse
from django.shortcuts import render
import datetime
def index(request):
context={
'today':datetime.datetime.now(),
}
return render(request,'index.html',context=context)
HTML
{{ today|date:'Y-m-d' }}
# 2019-11-05注意:datetime对象的默认形式,类似下面这样的,显然,不是我们想要的格式,故可以使用data过滤器达到想要效果格式:
from datetime import datetime
now=datetime.now()
now
datetime.datetime(2019, 12, 19, 14, 14, 30, 490242) # 类元组的格式吧...
date的其他参数,可以查阅官方文档进行修改
• default过滤器:若传入的value值为True,则返回该值,不做任何修改;若值为False,则返回default传入的值
示例:
views
def index(request):
context={
'value':'default值测试', # 若值为空list,则返回'计算为false'
}
html
{{ value|default:'计算为false' }}
#返回 default值测试default_if_none过滤器:仅仅只有值为None时,才渲染后面的值
示例:
views
def index(request):
context={
'value':None,
}
return render(request,'index.html',context=context)
html
{{ value|default_if_none:'传入的值为None' }}
# 结果为:传入的值为None• first/last过滤器:返回list,tuple,str的第一个/最后一个元素
示例:
views
def index(request):
context={
'value':['apple','pear','banana','noddle'],
}
return render(request,'index.html',context=context)
html
{{ value|last }}
# noddle{{ value|first }}
# apple• 对浮点数的位数进行限制---floatformat过滤器
示例:
views
def index(request):
context={
'value':63.8536,
}
return render(request,'index.html',context=context)
html
{{ value|floatformat }}
# 63.9 不传参,默认只保留一个小数,四舍五入{{ value|floatformat:2 }}
# 63.85 保留两位小数,四舍五入• join过滤器---对 list,str,tuple的元素进行拼接
示例:
views
def index(request):
context={
'value':[1,2,3,4]
}
return render(request,'index.html',context=context)
html
{{ value|join:'/' }}
# 1/2/3/4• length过滤器---返回list,str,tuple的的长度(从1开始)
示例:
views
def index(request):
context={
'value':[1,2,3,4]
}
return render(request,'index.html',context=context)
html
{{ value|length }}
# 4• lower(小写)/upper(大写)
示例:
views
def index(request):
context={
'value':'KING'
}
return render(request,'index.html',context=context)
html
{{ value|lower }}
# king• random过滤器:随机从list,tuple,str选择一个元素
示例:
views
def index(request):
context={
'value':[1,2,3,4,5,6,7]
}
return render(request,'index.html',context=context)
html
{{ value|random }}
# 随机出现一个数字• safe---相当于{% autoescape off %}
示例:
views
def index(request):
context={
'value':""
}
return render(request,'index.html',context=context)
html
{{ value|safe }}
# 弹窗(说明js执行成功),这里若把safe省略,则会被自动转义成普通str• slice---切片操作
示例:
views
def index(request):
context={
'value':[1,2,3,4,5,6]
}
return render(request,'index.html',context=context)
html
{{ value|slice:"3:5" }}
# [4,5] 切片从0开始• striptags过滤器:去除value的html标签
示例:
views
def index(request):
context={
'value':""
}
return render(request,'index.html',context=context)
html
{{ value|striptags }}
# alert('Hello World')• truncatechars过滤器:如果给定的字符串长度超过了过滤器指定的长度。那么会进行切割,并且拼接三个点来作为省略号
注意:三个点也算在指定的长度里面,算三个字符
示例:
views
def index(request):
context={
'value':"北京非常欢迎你"
}
return render(request,'index.html',context=context)
html
{{ value|truncatechars:"5" }}
# 北京...'''
解析:value长度为7,超过过滤器指定的长度5,触发切割,留3个字符给'.'号,所以只能分配两个字符给'北京'
'''
html
{{ value|truncatechars:"8" }}
# 北京非常欢迎你'''
解析:value长度为7,没有超过过滤器指定的长度8,没有触发切割,所以原样返回'
'''
• truncatechars_html过滤器:同理;不同的地方,它不会计算html元素
示例:
views
def index(request):
context={
'value':"北京非常欢迎你
"
}
return render(request,'index.html',context=context)
html
{{ value|truncatechars_html:"5" }}
#北京...
● 自定义过滤器
<1>新建app并install_app
<2>app目录下,新建py包,并且一定命名为'templatetags'
<3>新建filename.py文件(例如'my_filters.py')
<4>导入注册模块,编写需要的功能
示例:
from django import template
register=template.Library()
'''
a) 自定义的函数,最多只能有两个参数
b) 第一个参数,永远是|左边的变量
'''
def join_together(value,word):
return value+' '+word
register.filter('join_together',join_together)
另一种写法---装饰器修饰
from django import template
register=template.Library()
@register.filter('join_to') # 这里若不传过滤器名称,则默认以'函数名称'作为'过滤器名称'
def join_together(value,word):
return value+' '+word
<5>view,html示例如下:
views
def index(request):
context={
'value':"Hello"
}
return render(request,'index.html',context=context)
html
{% load my_filter %} # 不能忘记加载刚才定义'my_filter.py'
{{ value|join_together:'World' }}
# Hello World★ 实际需求功能:有一个这样的值
时间1分钟以内---值就显示:刚刚
1m 1h 1d x>30d---显示具体时间 from django import template @register.filter()my_filters.py
from datetime import datetime
def time_since(value): # value表示过去的时间
if not isinstance(value,datetime): # 对传入的值进行判断
return value
now=datetime.now() # 获取当前时间
timestamp=(now-value).total_seconds() # 获取时间差,用总秒数表示
if timestamp<60:
return '刚刚'
elif timestamp>=60 and timestamp<6060:
time=int(timestamp/60)
return '{} 分钟之前'.format(time)
elif timestamp>=6060 and timestamp<606024:
time=int(timestamp/60/60)
return '{} 小时之前'.format(time)
elif timestamp>=606024 and timestamp<606024*30:
time=int(timestamp/60/60/24)
return '{} 天之前'.format(time)
else:
return value.strftime("Y%-m%-d%-H%-M%") # 留意这种时间格式