Django(4)html模板继承、模板导入、分页实现
1.获取所有请求信息
导入模块:from django.core.handlers.wsgi import WSGIRequest
request.environ:包含所有的请求信息,可以打印看一下,它是一个字典
2.html模板之继承(一个网页只能继承一个模板)
公用模板master.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %} {% endblock %}</title>#这里设置title可替换,就用block块
<link rel="stylesheet" href="/static/commons.css" />
<style>
.pg-header{
height: 50px;
background-color: seashell;
color: green;
}
</style>
{% block css %} {% endblock %} #这里设置css替换块
</head>
<body>
<div class="pg-header">小男孩管理</div>
{% block content %} {% endblock %}#这里设置内容替换块
<div>
<a>asdf</a>
<a id="">asdf</a>
<a>asdf</a>
<a>asdf</a>
<a>asdf</a>
</div>
<iframe src="/"></iframe>
</body>
</html>
自定义网页tp1.html
{% extends 'master.html' %}#继承模板,指明继承的模板名
{% block title %}用户管理{% endblock %} #在相应的块里插入内容,块的顺序可以不跟模板中块的顺序相同
{% block content %} #在相应的块里插入内容
<h1>用户管理</h1>
<ul>
{% for i in u %}
<li>{{ i }}</li>
{% endfor %}
</ul>
{% for i in u %} #导入模板
{% include 'tag.html' %}
{% endfor %}
{% endblock %}
{% block css %} #在相应的块里插入内容
<style>
body{
background-color: red;
}
</style>
{% endblock %}
{% block js %}
<script></script>
{% endblock %}
3. html网页之模板导入
自定义模板文件tag.html,它是html的一个或多个标签,并不是完整的网页
<div>
<input type='text' />
</div>
在网页中导入模板
{% extends 'master.html' %}#模板继承
{% block title %}用户管理{% endblock %}
{% block content %}
<h1>用户管理</h1>
<ul>
{% for i in u %}
<li>{{ i }}</li>
{% endfor %}
</ul>
{% for i in u %}
{% include 'tag.html' %}#模板导入,这里就相当于将tag.html里的内容写在了这里
{% endfor %}
{% endblock %}
{% block css %}
<style>
body{
background-color: red;
}
</style>
{% endblock %}
{% block js %}
<script></script>
{% endblock %}
4.模板之自定义simple_tag,
步骤:
simple_tag
a. app下创建templatetags目录
b. 任意xxoo.py文件
c. 创建template对象 对象名必须叫register
d. xxoo.py的内容
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def houyafan(a1,a2,a3):
return a1 + a2 #最终在页面上呈现的值
e. settings中注册APP
f. 在要使用simple_tag的html顶部 写上{% load xxoo %}
g.在网页中使用该函数
{% 函数名 arg1 arg2 %}
缺点:
不能作为if条件
优点:
参数任意
5.模板之自定义filter
filter
a. app下创建templatetags目录
b. 任意xxoo.py文件
c. 创建template对象 register
d.xxoo.py中的内容
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.filter
def jiajingze(a1,a2):
print(a2,type(a2))
return a1 + str(a2)
e. settings中注册APP
f. 顶部 {% load xxoo %}
g. {{ 参数1|函数名:"参数二,参数三" }}或传数字参数 {{ 参数1|函数名:数字 }}
缺点: 最多两个参数,不能加空格
优点: 能作为if条件
6.实现分页,并且自定义选择显示的行数
一、自定义一个分页类,命名为pagination.py,在项目下新建一个目录utils,将pagination.py放在该目录下,这样其他app也可以调用这个类
__author__ = 'Administrator'
from django.utils.safestring import mark_safe
class Page:
def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):
self.current_page = current_page #当前页码
self.data_count = data_count #数据总量
self.per_page_count = per_page_count #每页显示数据的行数
self.pager_num = pager_num # 每页显示页码的个数
@property #加上这个属性后,在调用start函数时就不用加括号了
def start(self): #每页显示的开始页码数
return (self.current_page - 1) * self.per_page_count
@property
def end(self): #每页显示的结束页码数
return self.current_page * self.per_page_count
@property
def total_count(self): #获取总页数
v, y = divmod(self.data_count, self.per_page_count)
if y: #如果y不为0,则总页数v加一
v += 1
return v #
def page_str(self, base_url): #给前端传递html链接,base_url:自定义跳转的url
page_list = [] #初始化一个列表,它存放html链接,也就是可以点击的那些按钮
if self.total_count < self.pager_num:#如果总页数小于每页应该显示的页码数,则只显示的页码数等于总页数
start_index = 1
end_index = self.total_count + 1
else:
if self.current_page <= (self.pager_num + 1) / 2:#显示第一页的页码数,当点击第一个页码的时候不会出现异常
start_index = 1
end_index = self.pager_num + 1
else:
start_index = self.current_page - (self.pager_num - 1) / 2
end_index = self.current_page + (self.pager_num + 1) / 2
if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:#显示最后一页的页码数,
# 当点击最后一个页码的时候不会出现异常
start_index = self.total_count - self.pager_num + 1
end_index = self.total_count + 1
if self.current_page == 1:#显示上一页
prev = '<a class="page" href="javascript:void(0);">上一页</a>'
else:
prev = '<a class="page" href="%s?p=%s">上一页</a>' % (base_url, self.current_page - 1,)
page_list.append(prev)
for i in range(int(start_index), int(end_index)):#列出每一页的 “上一页 46 47 48 49 50 51 52 53 54 下一页 GO”
if i == self.current_page:#给当前页码加上颜色属性
temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i)
else:
temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i)
page_list.append(temp)
if self.current_page == self.total_count:
nex = '<a class="page" href="javascript:void(0);">下一页</a>'
else:
nex = '<a class="page" href="%s?p=%s">下一页</a>' % (base_url, self.current_page + 1,)
page_list.append(nex)
#增加跳转框,输入指定数字即可跳转,如果不输入数字则不会跳转
jump = """
<input type='text' class='inp' /><button onclick='jumpto(this,"%s?p=");'>GO</button>
<script>
function jumpto(ths,base){
var val = ths.previousSibling.value;
if(val){
location.href = base + val;
}else{
"%s#"
}
}
</script>
""" % (base_url,base_url)
page_list.append(jump)
page_str = mark_safe("".join(page_list))#mark_safe可以将传递给前端的标签字符串转变为标签
return page_str
二、在views.py中调用类pagination.py即可
from utils import pagination
LIST = []
for i in range(500):
LIST.append(i)
def user_list(request):
current_page = request.GET.get('p', 1)
current_page = int(current_page)
per_page_count = request.COOKIES.get('per_page_count',10)#获取cookie值,
per_page_count = int(per_page_count)
page_obj = pagination.Page(current_page,len(LIST),per_page_count)
data = LIST[page_obj.start:page_obj.end]
page_str = page_obj.page_str("/user_list/")
return render(request, 'user_list.html', {'li': data,'page_str': page_str})
三、前端user_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style>
.pagination .page{
display: inline-block;
padding: 5px;
background-color: cyan;
margin: 5px;
}
.pagination .page.active{
background-color: brown;
color: white;
}
</style>
</head>
<body>
<ul>
{% for item in li %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<div>
<select id="ps" onchange="changePageSize(this)"><!--jquery绑定js,必须加this参数-->
<option value="10">10</option>
<option value="30">30</option>
<option value="50">50</option>
<option value="100">100</option>
</select>
</div>
<div class="pagination">
{{ page_str }}
</div>
<script src="/static/jquery-1.12.4.js"></script>
{# 导入jquery.cookie.js插件,它必须放在jQuery下边#}
<script src="/static/jquery.cookie.js"></script>
<script>
$(function(){//自执行函数,选择页数,并且在页面改变页数
var v = $.cookie('per_page_count', {'path': "/user_list/"});//设置cookie,仅限/user_list/路径的cookie生效
$('#ps').val(v);
});
function changePageSize(ths){
var v = $(ths).val();//获取选择的值
$.cookie('per_page_count',v, {'path': "/user_list/"});//设置cookie
location.reload();//自动刷新页面
}
</script>
</body>
</html>
7.利用cookie实现用户登录
1、获取Cookie:
|
1
2
3
4
5
6
|
request.COOKIES['key']request.get_signed_cookie(key, default=RAISE_ERROR, salt='加密盐', max_age=None) 参数: default: 默认值 salt: 加密盐,get与set的值必须相同 max_age: 后台控制过期时间 |
2、设置Cookie:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
rep = HttpResponse(...) 或 rep = render(request, ...)rep.set_cookie(key,value,...)rep.set_signed_cookie(key,value,salt='加密盐',...) 参数: key, 键 value='', 值 max_age=None, 超时时间,在一定秒数后失效 expires=None, 超时日期,在指定时分秒后失效 path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) |
由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。
|
1
2
|
<script src='/static/js/jquery.cookie.js'></script>$.cookie("list_pager_num", 30,{ path: '/' });
|
基于cookie实现用户登录,不管访问什么页面,都会自动跳转到登录页面
views.py
user_info = {
"},
'kanbazi': {'pwd': "kkkkkkk"},
}
def login(request):
if request.method == "GET":
return render(request,'login.html')
if request.method == "POST":
u = request.POST.get('username')
p = request.POST.get('pwd')
dic = user_info.get(u)
if not dic:
return render(request,'login.html')
if dic['pwd'] == p:
res = redirect('/index/')
# res.set_cookie('username111',u,max_age=10)# 10秒后cookie失效
# import datetime
# current_date = datetime.datetime.utcnow()#获取当前时间
# invalud_date = current_date + datetime.timedelta(seconds=5) #在当前时间基础上加5秒
# res.set_cookie('username111',u,expires=current_date) #指定的时分秒后cookie失效
res.set_cookie('username111',u) #给res设置cookie
return res
else:
return render(request,'login.html')
def auth(func):
def inner(reqeust,*args,**kwargs):
v = reqeust.COOKIES.get('username111')
if not v:
return redirect('/login/')
return func(reqeust, *args,**kwargs)
return inner
@auth
def index(reqeust):
# 获取当前已经登录的用户
v = reqeust.COOKIES.get('username111')
return render(reqeust,'index.html',{'current_user': v})
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="/login/" method="POST">
<input type="text" name="username" placeholder="用户名" />
<input type="password" name="pwd" placeholder="密码" />
<input type="submit" />
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>欢迎登录:{{ current_user }}</h1>
</body>
</html>
Django(4)html模板继承、模板导入、分页实现的更多相关文章
- [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)
一.路由映射的参数 1.映射的一般使用 在app/urls.py中,我们定义URL与视图函数之间的映射: from django.contrib import admin from django.ur ...
- 第二百六十八节,Tornado框架-路由映射之二级域名支持,html模板继承以及导入
Tornado框架-路由映射之二级域名支持,html模板继承以及导入 二级域名路由映射add_handlers()设置二级域名路由映射 注意:二级域名需要结合服务器ip绑定域名 框架引擎 #!/usr ...
- Django学习手册 - 模板继承与导入
核心: PS:一个页面只能继承一个模板. 前置: 配置url. 配置views 关键字: 1. {% extends "index模板.html" %} 声明继承于哪个模板 ,关联 ...
- django基础知识之模板继承:
模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填 ...
- Django框架(十一):模板介绍、模板语言、模板继承、HTML转义
1. 模板介绍 1.1 模板的功能 产生html,控制页面上展示的内容.模板文件不仅仅是一个html文件. 模板文件包含两部分内容: 静态内容:css.js.html. 动态内容:用于动态去产生一些页 ...
- 4 Template层 -模板继承
1.模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板 ...
- python【第二十一篇】Django模板继承、分页、cookie验证
1.模板继承 母版master.html {% block title %}{% endblock %}2 {% block table-cont %}{% endblock %} 子板 {% ext ...
- Django 你需要掌握的模型层(标签、过滤器、模板的继承与导入)
Django 模型层(标签.过滤器.模板的继承与导入) 好文章来自超哥:https://www.cnblogs.com/guanchao/p/11006062.html 过滤器/自定义过滤器 模板 ...
- Django框架(七)-- 模板层:模板导入、模板继承、静态文件
一.模板导入 要复用一个组件,可以将该组件写在一个文件中,在使用的时候导入即可 在模板中使用 1.语法 {% include '模板名字' %} 2.使用 ad.html页面 <div clas ...
随机推荐
- jquery html动态添加的元素绑定事件详解
在实际开发中会遇到要给动态生成的html元素绑定触发事件的情况: <div id="testdiv"> <ul></ul> </div&g ...
- Python 日常积累
包管理 >from ... import ... 的用法和直接import的区别 直接使用import时,如果需要使用到导入模块内的属性和方法,必须使用模块名.属性和模块名.方法的方式进行调用 ...
- myeclipse配置maven
1.首先配置好java的运行环境(JDK要1.7及以上版本),网上有详细资料. 2.下载maven,具体下载链接http://maven.apache.org/download.html 3.下载ap ...
- SSH框架的简单上传功能的实现
1.创建项目. 2.导入开发包. 3.配置web.xml. 配置内容就是配置struct2的内容如下: <?xml version="1.0" encoding=" ...
- 架构师养成记--11.Executor概述
常用方法 Executors.newFiexdPool(int nThreads);固定线程数量的线程池: Executors.newSingleThreadExecutor();单个线程的线程池: ...
- IIS配置MP3/MP4/OGG/flv等资源文件访问
配置过程参考:http://www.cnblogs.com/EasonJim/p/4752399.html 以下包含了mp4的mime类型: 323 text/h323 acx application ...
- input placeholder属性 样式修改(颜色,大小,位置)
placeholder属性 样式修改 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...
- 写了个项目 Web-Rtmp: 使用 WebSocket 在网页上播放 RTMP 直播流
http://neue.v2ex.com/t/316766 虽说浏览器里用 js 解码'播放'视频的方案已经有几个了... 为什么不再多一个呢... 基本原理: 服务端使用 websockify 中转 ...
- 人工智能之一《tensorflow》
http://wiki.jikexueyuan.com/project/tensorflow-zh/
- SFDC中的DEBUG
SFDC的顾问初期,基本都是做一些配置的工作,权限,字段,工作流和审批流之类.那么在这些工作流或者审批流没有按照你预想的来运行而且你检查了多遍后没有找到问题所在的时候.你就需要DEBUG了. 做过开发 ...