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模板继承、模板导入、分页实现的更多相关文章

  1. [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)

    一.路由映射的参数 1.映射的一般使用 在app/urls.py中,我们定义URL与视图函数之间的映射: from django.contrib import admin from django.ur ...

  2. 第二百六十八节,Tornado框架-路由映射之二级域名支持,html模板继承以及导入

    Tornado框架-路由映射之二级域名支持,html模板继承以及导入 二级域名路由映射add_handlers()设置二级域名路由映射 注意:二级域名需要结合服务器ip绑定域名 框架引擎 #!/usr ...

  3. Django学习手册 - 模板继承与导入

    核心: PS:一个页面只能继承一个模板. 前置: 配置url. 配置views 关键字: 1. {% extends "index模板.html" %} 声明继承于哪个模板 ,关联 ...

  4. django基础知识之模板继承:

    模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填 ...

  5. Django框架(十一):模板介绍、模板语言、模板继承、HTML转义

    1. 模板介绍 1.1 模板的功能 产生html,控制页面上展示的内容.模板文件不仅仅是一个html文件. 模板文件包含两部分内容: 静态内容:css.js.html. 动态内容:用于动态去产生一些页 ...

  6. 4 Template层 -模板继承

    1.模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板 ...

  7. python【第二十一篇】Django模板继承、分页、cookie验证

    1.模板继承 母版master.html {% block title %}{% endblock %}2 {% block table-cont %}{% endblock %} 子板 {% ext ...

  8. Django 你需要掌握的模型层(标签、过滤器、模板的继承与导入)

    Django 模型层(标签.过滤器.模板的继承与导入) 好文章来自超哥:https://www.cnblogs.com/guanchao/p/11006062.html   过滤器/自定义过滤器 模板 ...

  9. Django框架(七)-- 模板层:模板导入、模板继承、静态文件

    一.模板导入 要复用一个组件,可以将该组件写在一个文件中,在使用的时候导入即可 在模板中使用 1.语法 {% include '模板名字' %} 2.使用 ad.html页面 <div clas ...

随机推荐

  1. OpenCV安装与配置

    本文使用OpenCV2.48在win10平台下操作. 一,关于OpenCV OpenCV是开源C++计算机可视化处理库,它集成了很多计算机图形图像处理的功能.还有机器学习,字符识别,人脸识别,物体检测 ...

  2. oracle日常——数据库备份

    1.进入cmd 2.运行命令 exp [scott]/[orcl]@[orcl] file=[d:\oracle_back\scott_orcl.dmp] owner=scott 格式如下: exp ...

  3. .Net Core Logger 实现log写入本地文件系统

    .net core 自带一个基础的logger框架Microsoft.Extensions.Logging. 微软默认实现了Microsoft.Extensions.Logging.Console.d ...

  4. 自建Ceph存储与 AWS、阿里云、腾讯云的成本对比

    本文单从存储成本角度对比了自建Ceph存储和业界公有云存储的硬件成本,不包括IDC带宽成本. 统计Ceph集群的用到的主要设备为: OSD.MON.RGW服务器 .TOR交换机. 机架. 下表解释: ...

  5. C#重写一个控件Label

    1. 首先你把一个label控件拖到窗体上.2. 创建一个准备继承的类,比如叫LabelEx,派生于Label类 public class LabelEx : Label { //鼠标左键双击消息 p ...

  6. 163邮箱问题:554 DT:SPM 163 smtp5,D9GowACHO7RNWNdXmXs1Bw--.9035S2

    最近公司需要开发一个自定义邮箱功能,上网查询一下,利用163邮箱发送邮件. 由于163 的反垃圾机制,(坑爹机制.) 一般出现 554有在1)测试中用了test,测试,关键字在主题或者内容里面. 但是 ...

  7. Mysql 常用 SQL 语句集锦

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  8. Généralement c'est un mélange qui me devient personnellement

    Parmi mes plus grands problèmes personnels avec maisons de rue conventionnelles est en fait ils sont ...

  9. 淘宝分布式文件存储系统:TFS

    TFS ——分布式文件存储系统 TFS(Taobao File System)是淘宝针对海量非结构化数据存储设计的分布式系统,构筑在普通的Linux机器集群上,可为外部提供高可靠和高并发的存储访问. ...

  10. JavaScript中事件和属性有什么区别吗?或者说事件与方法有什么区别?

    https://zhidao.baidu.com/question/1691946187489353788.html