django - Templates模板嵌套语法
模板继承
1、继承母板:{% extends '母板html文件名称' %}
2、包含子模板:{% include '子母板html 文件名' %}
模板内容分块 {% block <分块名> %}{% endblock %}
对某一区域分块命名,继承模板时覆盖 “母板” 中的同名块儿 {% block title %}{% endblock %}
3、利用request 请求对象中内容,例如session {{ request.session.current_user }}
自定义python函数应用于模板
(方法一:simple_tag)
1、在app 目录下创建templatetags 目录(名称不可更改)
2、创建任意.py文件,如xxoo.py ,在文件内写自定义功能的函数。使用django.template.Library()创建register对象(对象名不可更改)
使用 @register.simple_tag 装饰自定义函数
示例xxoo.py
from django import template register = template.Library()
@register.simple_tag
def plus(a1, a2):
return a1 + a2
对象名必须为register
3、模板中使用 {% load '书写自定义函数的文件名' %}
函数用法 {% 函数名 参数...%}
{% load xxoo %} {% plus 1 3 %}
优点:参数个数没有限制,缺点:不能使用if语句
(方法二:filter)
1、在app 目录下创建templatetags 目录(名称不可更改)
2、创建任意.py文件,如xxoo.py ,在文件内写自定义功能的函数。使用django.template.Library()创建register对象(对象名不可更改)
使用 @register.simple_tag 装饰自定义函数
示例xxoo.py
from django import template register = template.Library() @register.filter
def plus(a1, a2): # 形参最多支持2个
return a1 + a2
3、模板中使用 {% load '书写自定义函数的文件名' %} 加载,
函数用法:{{ 参数1|函数名:参数二 }}
html中语法示例:
{{ 2|plus:1 }}
优点:可以使用if语句 缺点:定义函数时参数个数最多两个,使用时参数1|函数名:参数2 之间不能有空格
{% if 2|plus:2 > 3 %}
<span>大于3</span>
{% endif %}
分页功能
django.utils.safestring import make_safe 后端设置字符串为安全字符串,在模板中渲染时字符串中的html标签不做转义。浏览器可以正常解析html标签
views.py 获取指定分页值,根据分页获展示指定分页数据
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.views import View from app02 import models
from django.utils.safestring import mark_safe
# Create your views here. LIST = range(1, 101) class PageTest(View):
def get(self,request):
# 获取当前页码
current_page = int(request.GET.get('p', 1))
# 单页显示数量
page_size = request.GET.get('size', 10) start = (current_page - 1) * page_size
end = current_page * page_size
# 当前页显示的数据
data = LIST[start:end] # 分页个数逻辑,根据数据总数/每页显示个数计算
all_count = len(LIST)
count, y = divmod(all_count, page_size)
# 如果余数不为零 则需要加一页显示
if y:
count += 1
# 分页标签html字符串
page_list = []
for i in range(1, count + 1):
if current_page == i:
temp = '<a class="page active" href="/database_study/page-test/?p=%s">%s</a>' % (i, i)
else:
temp = '<a class="page " href="/database_study/page-test/?p=%s">%s</a>' % (i, i)
page_list.append(temp)
# 将列表中每个分页html字符串相连接
page_str = ''.join(page_list)
# 将字符串设置为安全字符串from django.utils.safestring import mark_safe
page_str = mark_safe(page_str)
return render(request, 'page_test.html', {'li': data, 'page_str': page_str})
分页数量过多,分页标签只展示部分。
示例代码:
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.views import View from app02 import models
from django.utils.safestring import mark_safe
# Create your views here. LIST = []
for i in range(1, 1001):
LIST.append({'key': 'value' + str(i)}) class PageTest(View):
def get(self,request):
# 获取当前页码
current_page = int(request.GET.get('p', 1))
# 单页显示数量
page_size = int(request.GET.get('size', 10)) # 当前页显示的数据
start = (current_page - 1) * page_size
end = current_page * page_size
data = LIST[start:end] # 分页个数计算,根据数据总数/每页显示个数计算
all_count = len(LIST)
page_count, y = divmod(all_count, page_size)
# 如果余数不为零 则需要加一页显示
if y:
page_count += 1 # 每页显示几个分页标签
page_num = 7 # 分页标签html字符串
page_list = [] # 当前分页标签居中,计算起始和结束分页标签
# 分页数量不足设定的最少标签(本例:7个)的时候,起始为第一页,结束为分页总数
if page_count < page_num:
start_index = 1
end_index = page_count + 1
# 分页大于一次性显示的分页标签时
else:
# 判断当前页位置,如果在设定显示页数的最前面1/2时,起始和结束分页标签的位置
if current_page <= (page_num + 1)/2:
start_index = 1
end_index = page_num + 1
# 当前也在中间或者总分页最后几页时,计算起始和结束标签页
else:
# 当前页在总页数 - 单页显示标签数1/2之间时,避免超出总分页,计算起始和结束页码
if current_page + (page_num + 1)/2 > page_count:
end_index = page_count +1
start_index = page_count - page_num + 1
# 当前页码在中间位置,前后都没有超出页码范围,计算起始和结束标签
else:
start_index = current_page - (page_num -1)/2
end_index = current_page + (page_num + 1)/2
start_index = int(start_index)
end_index = int(end_index) # 上一页标签
if current_page == 1:
prev_page = '<a class="page " href="javascript:void(0);">上一页</a>'
else:
prev_page = '<a class="page " href="/database_study/page-test/?p=%s&size=%s">上一页</a>' % ((current_page - 1), page_size)
page_list.append(prev_page) for i in range(start_index, end_index):
if current_page == i:
temp = '<a class="page active" href="/database_study/page-test/?p=%s&size=%s">%s</a>' % (i, page_size, i)
else:
temp = '<a class="page " href="/database_study/page-test/?p=%s&size=%s">%s</a>' % (i, page_size, i)
page_list.append(temp)
# 下一页标签
if current_page == page_count:
next_page = '<a class="page " href="javascript:void(0);">下一页</a>'
else:
next_page = '<a class="page " href="/database_study/page-test/?p=%s&size=%s">下一页</a>' % ((current_page + 1), page_size)
page_list.append(next_page) # 将列表中每个分页html字符串相连接
page_str = ''.join(page_list)
# 将字符串设置为安全字符串from django.utils.safestring import mark_safe
page_str = mark_safe(page_str)
return render(request, 'page_test.html', {'li': data, 'page_str': page_str})
html 文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.pagination .page {
display: inline-block;
padding: 5px;
margin: 5px;
background-color: #6DDCBD;
}
.pagination .page.active {
background-color: brown;
color: white;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
<li>{{ item }} </li>
{% endfor %}
</ul> <div class="pagination">
{{ page_str }}
</div>
</body>
</html>
面向对象方式,封装分页功能
from django.shortcuts import render
from django.shortcuts import HttpResponse
from django.views import View from app02 import models
from django.utils.safestring import mark_safe
# Create your views here. # 模拟 数据库获取到千余条数据
LIST = []
for i in range(1, 1001):
LIST.append({'key': 'value' + str(i)}) class CalcPageTag(object):
def __init__(self,page_size, data_count, current_page, page_num, ):
self.data_count = data_count
self.page_size = page_size
self.current_page = current_page
self.page_num = page_num def start(self):
start_data_index = (self.current_page - 1) * self.page_size
return start_data_index def end(self):
end_data_index = self.current_page * self.page_size
return end_data_index def page_count(self):
# 分页个数计算,根据数据总数/每页显示个数计算
count_num, y = divmod(self.data_count, self.page_size)
# 如果余数不为零 则需要加一页显示
if y:
count_num += 1
return count_num
def page_tag(self): page_count = self.page_count()
# 当前分页标签居中,计算起始和结束分页标签
# 分页数量不足设定的最少标签(本例:7个)的时候,起始为第一页,结束为分页总数
if page_count < self.page_num:
start_index = 1
end_index = page_count + 1
# 分页大于一次性显示的分页标签时
else:
# 判断当前页位置,如果在设定显示页数的最前面1/2时,起始和结束分页标签的位置
if self.current_page <= (self.page_num + 1)/2:
start_index = 1
end_index = self.page_num + 1
# 当前也在中间或者总分页最后几页时,计算起始和结束标签页
else:
# 当前页在总页数 - 单页显示标签数1/2之间时,避免超出总分页,计算起始和结束页码
if self.current_page + (self.page_num + 1)/2 > page_count:
end_index = page_count + 1
start_index = page_count - self.page_num + 1
# 当前页码在中间位置,前后都没有超出页码范围,计算起始和结束标签
else:
start_index = self.current_page - (self.page_num - 1)/2
end_index = self.current_page + (self.page_num + 1)/2
start_index = int(start_index)
end_index = int(end_index)
return start_index, end_index
def page_tag_str(self,base_url):
# 分页标签html字符串
page_list = []
start_index, end_index = self.page_tag() # 上一页标签
if self.current_page == 1:
prev_page = '<a class="page " href="javascript:void(0);">上一页</a>'
else:
prev_page = '<a class="page" href="%s?p=%s&size=%s">上一页</a>' % (base_url, (self.current_page - 1), self.page_size)
page_list.append(prev_page) # 分页标签html字符串
for i in range(start_index, end_index):
if self.current_page == i:
temp = '<a class="page active" href="%s?p=%s&size=%s">%s</a>' % (base_url, i, self.page_size, i)
else:
temp = '<a class="page " href="%s?p=%s&size=%s">%s</a>' % (base_url, i, self.page_size, i)
page_list.append(temp) # 下一页标签
if self.current_page == self.page_count():
next_page = '<a class="page " href="javascript:void(0);">下一页</a>'
else:
next_page = '<a class="page " href="%s?p=%s&size=%s">下一页</a>' % (base_url, (self.current_page + 1), self.page_size)
page_list.append(next_page) # 将列表中每个分页html字符串相连接
page_str = ''.join(page_list)
# 将字符串设置为安全字符串from django.utils.safestring import mark_safe
page_str = mark_safe(page_str)
return page_str class PageTest(View):
def get(self,request):
# 获取当前页码
current_page = int(request.GET.get('p', 1)) # 单页显示数量
page_size = int(request.GET.get('size', 10)) # 显示几个分页标签
page_num = 7 # 实例化自定义数据范围&标签计算类。
page = CalcPageTag(page_size=page_size, data_count=len(LIST), current_page=current_page,page_num=page_num) # 当前页显示的数据
data = LIST[page.start():page.end()] tag_base_url = '/database_study/page-test/'
page_str = page.page_tag_str(tag_base_url) return render(request, 'page_test.html', {'li': data, 'page_str': page_str})
备注: <a class="page " href="javascript:void(0);">上一页</a> 标签 中 href="javascript:void(0)表示什么都不做
django - Templates模板嵌套语法的更多相关文章
- Django templates 模板的语法
MVC 以及 MTV MVC: M : model -->> 存取数据(模型) V: view -->> 信息的展示(视图) C: controller -->> ...
- django templates模板
Django templates模板 HTML代码可以被直接硬编码在views视图代码中,虽然这样很容易看出视图是怎么工作的,但直接将HTML硬编码到视图里却并不是一个好主意. 让我们来看一下为什么: ...
- python - django 解决 templates 模板语言语法冲突
# 在使用某个框架时发现语法与Django的模板语法冲突了,于是找到解决方案: {% verbatim %} // 被 verbatim 包裹起来的地方是不会被 django 渲染的 {% endve ...
- Django web框架-----Django templates模板
说明:mytestsite是django框架下的项目,quicktool是mytestsite项目中的应用 一般的变量之类的用 {{ }}(变量),功能类的比如循环.条件判断是用 {% %}(标签) ...
- Django之模板层-语法:{{ }}
模版语法的深度查询(.) views.py def index(request): name = 'name' lis = [1,2,3,4,5,6] dic = {"name": ...
- Discuz!开发之模板标签语法学习
一.加载模板 使用template()函数显示已存在模板: 在Discuz!程序执行中可以通过 include template('模板文件夹/模板名称无后缀');的方式进行解析! template( ...
- Python Web框架篇:Django templates(模板)
为什么用templates? views.py视图函数是用来写Python代码的,HTML可以被直接硬编码在views.py之中.如下: import datetime def current_tim ...
- Django templates(模板)
为什么用templates? views.py视图函数是用来写Python代码的,HTML可以被直接硬编码在views.py之中.如下: import datetime def current_tim ...
- Django笔记&教程 3-3 模板常用语法
Django 自学笔记兼学习教程第3章第3节--模板常用语法 点击查看教程总目录 本文主要参考:https://docs.djangoproject.com/en/2.2/ref/templates/ ...
随机推荐
- deepin系统安装与linux磁盘分区
制作系统盘工具 链接:https://pan.baidu.com/s/1zcV0oulUErUdU0PAGxTDdw 提取码:1111 链接:https://pan.baidu.com/s/13zBd ...
- SpringCloud微服务实战——搭建企业级开发框架(二十五):实现多租户多平台短信通知服务
目前系统集成短信似乎是必不可少的部分,由于各种云平台都提供了不同的短信通道,这里我们增加多租户多通道的短信验证码,并增加配置项,使系统可以支持多家云平台提供的短信服务.这里以阿里云和腾讯云为例,集成短 ...
- Codeforces 1188B - Count Pairs(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 虽说是一个 D1B,但还是想了我足足 20min,所以还是写篇题解罢( 首先注意到这个式子里涉及两个参数,如果我们选择固定一个并动态维护另 ...
- [CF707 Div2, A ~ D]
(相信进这个博客的人,都已经看过题目了,不再赘述) 这把打小号打到了\(484\),\(rating + 636\) \(A\) 考虑进行模拟就行了,说白了这是一个英语阅读题 // code by D ...
- Codeforces 407E - k-d-sequence(单调栈+扫描线+线段树)
Codeforces 题面传送门 & 洛谷题面传送门 深感自己线段树学得不扎实-- 首先特判掉 \(d=0\) 的情况,显然这种情况下满足条件的区间 \([l,r]\) 中的数必须相同,双针扫 ...
- Telink BLE MESH PWM波的小结
本本针对Telink BLE MESH SDK 灯控的使用进行说明. 1.调整灯光的频率 默认情况下 SDK PWM波的频率是 600HZ的,有时我们需要将它调整频率,例如调整为4K,只需要更改参数 ...
- oracle 将电话号码中间4位数以星号*代替
select replace('17665312355',substr('17665312355',4,4),'****') as phone, #类似E ...
- 在Kubernetes上安装MySQL-PXC集群
官方部署文档地址:https://www.percona.com/doc/kubernetes-operator-for-pxc/kubernetes.html 一.部署方式 示例在k8s集群(至少3 ...
- C语言中的各种字符串输入方法
C语言从stdin读取一行字符串的几种方法 gets gets函数的头文件是<stdio.h>,原型如下: char *gets(char *s); gets从stdin中读入一行内容到s ...
- day12 form组件
day12 form组件 今日内容 form组件前戏 form组件基本定义 form组件数据校验功能 form组件渲染标签 form组件提示信息 数据校验进阶 form组件补充 form组件源码探索 ...