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 ...
随机推荐
- js兼容性
1.getElementByClassName 在使用原生JavaScript时,获取类选择符时,即使用getElementByClassName,它在Firefox和IE下是不能兼容. Firefo ...
- Java学习笔记(一)
纯属个人学习笔记,有什么不足之处大家留言,谢谢 Java程序打包与JAR运行方法 在Eclipse的"包资源管理器"视图中找到要打包成JAR文件的项目.在项目名称上单击鼠标右键,在 ...
- Django补遗(一)
链接MYSQL数据库 修改项目中的配置文件: DATABASES = { 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME' ...
- C#获取本地IP地址[常用代码段]
获得当前机器的IP代码,假设本地主机为单网卡 string strHostName = Dns.GetHostName(); //得到本机的主机名 IPHostEntry ipEntry = Dns. ...
- UVA1586
#include<stdio.h> #include<string.h> #include<ctype.h> int main(){ int n; ]; int n ...
- HTML5规范-相关资料链接(大多都是英文文档)
网站做的更规范,尽量选择正确的HTML5结构元素.地址:http://html5doctor.com/happy-1st-birthday-us/#flowchat 了解算法和分块 知道文档 ...
- FZU 2105Digits Count(线段树 + 成段更新)
Description Given N integers A={A[0],A[1],...,A[N-1]}. Here we have some operations: Operation 1: AN ...
- prefix pct文件配置Xcode
1.查看项目的各个文件夹下的文件名称: 2.配置如下图:需要添加$(SRCROOT)/项目的名称/pch所在文件夹路径 .易于理解方便那些初学者,下载别人的demO运行时遇到这样的类似的问题噢.< ...
- 检测对象是否为数组 instanceof
[1,2] instanceof Array //true Object.prototype.toString.apply([]); === "[object Array]"; O ...
- php的empty(),trim(),strlen()方法
如果empty()函数的参数是非空或非零的值,则empty()返回FALSE.换句话说,"".0."0".NULL.array().var$var:以及没有任何 ...