继承 extends

子版只能继承一个父模板

1.父模板 master.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{% block title %} {% endblock %}</title>
  6. <link rel="stylesheet" href="/static/common.css">
  7. <style>
  8. .pg-header{
  9. height: 50px;
  10. background-color: red;
  11. color:blue
  12. }
  13. {% block css %} {% endblock %}
  14. </style>
  15. </head>
  16. <body>
  17. <div class="pg-header">小男孩管理</div>
  18.  
  19. {% block content %} {% endblock %}
  20.  
  21. <div class="pg-footer"></div>
  22.  
  23. <script src="/static/jquery-1.12.4.js"></script>
  24.  
  25. {% block js %} {% endblock %}
  26. </body>
  27. </html>

2.子版继承方法

  1. {% extends 'master.html' %} #引用母版
  2.  
  3. {% block title %}用户管理{% endblock %}
  4.  
  5. {% block content %}
  6. <h1>用户管理</h1>
  7. <ul>
  8. {% for i in u %}
  9. <li>{{ i }}</li>
  10. {% endfor %}
  11. </ul>
  12. {% endblock %}
  13.  
  14. {% block css %}
  15. <style>
  16. body{
  17. background-color: black;
  18. }
  19. </style>
  20. {% endblock %}
  21.  
  22. {% block js %}
  23. <script>
  24.  
  25. </script>
  26. {% endblock %}

导入定制的组件 include

创建tag.html

在index.html中导入tag.html,可以导入很多个

  1. {% include 'tag.html' %}

tag.html

  1. form>
  2. <input type="text" name="user"/>
  3. <input type="submit" value="提交"/>
  4. </form>

index.html

  1. {# 指定继承的模板 #}
  2. {% extends 'master.html' %}
  3.  
  4. {# 指定替换的位置 #}
  5. {% block title %}
  6. tp1
  7. {% endblock %}
  8.  
  9. {# 指定替换的位置 #}
  10. {% block content %}
  11. <p>tp1</p>
  12.  
  13. {# 导入单独组件 #}
  14. {% include 'tag.html' %}
  15. {% endblock %}

simple_tag and filter

1.django默认自带方法

  1. {{ item.event_start|date:"Y-m-d H:i:s"}} #日期格式进行转换
  2. {{ bio|truncatewords:"30" }} #取字符串前30位
  3. {{ my_list|first|upper }} #第一个字符大写
  4. {{ name|lower }} #所有字符小写

2.simple_tag

  1. 第一步: app01下面创建templatetags(必须是这个名字)文件夹
  2.  
  3. 第二步:在templatetags下面创建test1.py文件
  4.  
  5. 第三步:模板中 首先在开头要先导入 {% load test1 %}
  6.  
  7. 第四步: 模板中使用方法 {% 函数名 参数1 参数2 %}

test1.py

  1. from django import template
  2. from django.utils.safestring import mark_safe
  3. # 必须是register对象
  4. register = template.Library()

  5. @register.simple_tag
  6. def func(a1,a2):
  7. return a1 + a2

index.py

  1. {% load test1 %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. {{ name }}
  10. {{ name|lower }}
  11.  
  12. {% func 2 5 %}
  13. </body>
  14. </html>

3.filter

test1.py

  1. from django import template
  2. from django.utils.safestring import mark_safe
  3. # 必须是register对象
  4. register = template.Library()

  5. @register.simple_tag
  6. def func(a1,a2):
  7. return a1 + a2
  8.  
  9. @register.filter()
  10. def func1(b1,b2):
  11. return b1 + b2

index.py

  1. {% load test1 %}
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <title>Title</title>
  7. </head>
  8. <body>
  9. {{ name }}
  10. {{ name|lower }}
  11.  
  12. {# simpletag#}
  13. {% func 2 5 %}
  14.  
  15. {# filter#}
  16. {{ 'zhang'|func1:'derek' }}
  17.  
  18. </body>
  19. </html>

总结:

  1. simple:
  2.  
  3. 优点:参数任意
  4.  
  5. 缺点:不能作为if条件
  6.  
  7. filter
  8.  
  9. 优点:最多两个参数
  10.  
  11. 缺点:可以作为if条件

分页

1.简单分页

涉及xss攻击,需要用到mark_safe方法,使用此方法字符串传输到后端后,已html形式显示,而非字符串

HTML文件

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .pagination .page{
  8. display: inline-block;
  9. padding: 5px;
  10. background-color: cyan;
  11. margin: 5px;
  12. }
  13. .pagination .page.active{
  14. background-color: brown;
  15. color: white;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <ul>
  21. {% for item in li %}
  22. <li>{{ item }}</li>
  23. {% endfor %}
  24. </ul>
  25. <div class="pagination">
  26. {{ page_str }}
  27. </div>
  28. </body>
  29. </html>

user_list.html

views.py

  1. from django.shortcuts import render,HttpResponse
  2. from django.core.handlers.wsgi import WSGIRequest
  3. from django.utils.safestring import mark_safe
  4.  
  5. LIST = []
  6. for i in range(109):
  7. LIST.append(i)
  8.  
  9. from django.utils.safestring import mark_safe
  10. def user_list(request):
  11. current_page = request.GET.get('p',1)
  12. current_page = int(current_page)
  13.  
  14. start = (current_page-1)*10
  15. end = current_page*10
  16. data = LIST[start:end]
  17.  
  18. all_count = len(LIST)
  19. count,y = divmod(all_count,10)
  20. if y :
  21. count +=1
  22.  
  23. page_list = []
  24. for i in range(1,count+1):
  25. if i == current_page:
  26. temp = '<a class="page active" href="/user_list/?p=%s">%s</a>'%(i,i)
  27. else:
  28. temp = '<a class="page" href="/user_list/?p=%s">%s</a>'%(i,i)
  29.  
  30. page_list.append(temp)
  31.  
  32. page_str = mark_safe(''.join(page_list))
  33.  
  34. return render(request,'user_list.html',{'li':data,'page_str':page_str})

浏览器访问地址

  1. 浏览器访问地址:http://127.0.0.1:8000/user_list/?p=3

2.增加功能

分页数进行定制,添加上一页、下一页,增加跳转功能,实现分页的完整功能

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .pagination .page{
  8. display: inline-block;
  9. padding: 5px;
  10. background-color: cyan;
  11. margin: 5px;
  12. }
  13. .pagination .page.active{
  14. background-color: brown;
  15. color: white;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <ul>
  21. {% for item in li %}
  22. <li>{{ item }}</li>
  23. {% endfor %}
  24. </ul>
  25. <div class="pagination">
  26. {{ page_str }}
  27. </div>
  28. </body>
  29. </html>
  30.  
  31. user_list.html

user_list

views.py

  1. LIST = []
  2. for i in range(199):
  3. LIST.append(i)
  4.  
  5. from django.utils.safestring import mark_safe
  6. def user_list(request):
  7. current_page = request.GET.get('p',1)
  8. current_page = int(current_page)
  9.  
  10. start = (current_page-1)*10
  11. end = current_page*10
  12. data = LIST[start:end]
  13.  
  14. all_count = len(LIST)
  15. total_count,y = divmod(all_count,10)
  16. if y :
  17. total_count +=1
  18. pager_num = 11 #页码数
  19.  
  20. page_list = []
  21. if total_count < pager_num : #总页面小于页码数
  22. start_index = 1
  23. end_index = total_count + 1
  24. else:
  25. if current_page <= pager_num/2: #开头
  26. start_index = 1
  27. end_index = pager_num + 1
  28. elif current_page + (pager_num-1)/2 >= total_count: #中间
  29. start_index = total_count - (pager_num-1)
  30. end_index = total_count + 1
  31. else: #结尾
  32. start_index = current_page - (pager_num-1)/2
  33. end_index = current_page + (pager_num-1)/2 + 1
  34.  
  35. # 上下页码
  36. if current_page == 1:
  37. prev = '<a class="page" href="javascript:void(0)">上一页</a>' # 什么都不干
  38. else:
  39. prev = '<a class="page" href="/user_list/?p=%s">上一页</a>'%(current_page-1)
  40. page_list.append(prev)
  41. for i in range(int(start_index),int(end_index)):
  42. if i == current_page:
  43. temp = '<a class="page active" href="/user_list/?p=%s">%s</a>'%(i,i)
  44. else:
  45. temp = '<a class="page" href="/user_list/?p=%s">%s</a>'%(i,i)
  46.  
  47. page_list.append(temp)
  48. if current_page == total_count:
  49. nex = '<a class="page" href="javascript:void(0)">下一页</a>' # 什么都不干
  50. else:
  51. nex = '<a class="page" href="/user_list/?p=%s">下一页</a>'%(current_page+1)
  52. page_list.append(nex)
  53.  
  54. # 跳转 可以写到前端
  55. jump = '''
  56. <input type="text" /><a onclick="jumpTo(this,'/user_list/?p=');">GO</a>
  57. <script>
  58. function jumpTo(ths,base) {
  59. var val = ths.previousSibling.value;
  60. location.href = base + val;
  61. }
  62. </script>
  63. '''
  64. page_list.append(jump)
  65.  
  66. page_str = mark_safe(''.join(page_list))
  67.  
  68. return render(request,'user_list.html',{'li':data,'page_str':page_str})

3.优化完善

页码代码跟业务代码分开,创建class类,然后views导入进去

app01下面创建 utils文件夹,里面创建pagination.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .pagination .page{
  8. display: inline-block;
  9. padding: 5px;
  10. background-color: cyan;
  11. margin: 5px;
  12. }
  13. .pagination .page.active{
  14. background-color: brown;
  15. color: white;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <ul>
  21. {% for item in li %}
  22. <li>{{ item }}</li>
  23. {% endfor %}
  24. </ul>
  25. <div class="pagination">
  26. {{ page_str }}
  27. </div>
  28. </body>
  29. </html>
  30.  
  31. user_list.html

user_list.html

views.py

  1. LIST = []
  2. for i in range(199):
  3. LIST.append(i)
  4.  
  5. class Page:
  6. def __init__(self, current_page, data_count, per_page_count=10, pager_num=7):
  7. self.current_page = current_page
  8. self.data_count = data_count
  9. self.per_page_count = per_page_count
  10. self.pager_num = pager_num
  11.  
  12. @property
  13. def start(self):
  14. return (self.current_page - 1) * self.per_page_count
  15.  
  16. @property
  17. def end(self):
  18. return self.current_page * self.per_page_count
  19.  
  20. @property
  21. def total_count(self):
  22. v, y = divmod(self.data_count, self.per_page_count)
  23. if y:
  24. v += 1
  25. return v
  26.  
  27. def page_str(self, base_url):
  28. page_list = []
  29.  
  30. if self.total_count < self.pager_num:
  31. start_index = 1
  32. end_index = self.total_count + 1
  33. else:
  34. if self.current_page <= (self.pager_num + 1) / 2:
  35. start_index = 1
  36. end_index = self.pager_num + 1
  37. else:
  38. start_index = self.current_page - (self.pager_num - 1) / 2
  39. end_index = self.current_page + (self.pager_num + 1) / 2
  40. if (self.current_page + (self.pager_num - 1) / 2) > self.total_count:
  41. end_index = self.total_count + 1
  42. start_index = self.total_count - self.pager_num + 1
  43.  
  44. if self.current_page == 1:
  45. prev = '<a class="page" href="javascript:void(0);">上一页</a>'
  46. else:
  47. prev = '<a class="page" href="%s?p=%s">上一页</a>' % (base_url, self.current_page - 1,)
  48. page_list.append(prev)
  49.  
  50. for i in range(int(start_index), int(end_index)):
  51. if i == self.current_page:
  52. temp = '<a class="page active" href="%s?p=%s">%s</a>' % (base_url, i, i)
  53. else:
  54. temp = '<a class="page" href="%s?p=%s">%s</a>' % (base_url, i, i)
  55. page_list.append(temp)
  56.  
  57. if self.current_page == self.total_count:
  58. nex = '<a class="page" href="javascript:void(0);">下一页</a>'
  59. else:
  60. nex = '<a class="page" href="%s?p=%s">下一页</a>' % (base_url, self.current_page + 1,)
  61. page_list.append(nex)
  62.  
  63. jump = """
  64. <input type='text' /><a onclick='jumpTo(this, "%s?p=");'>GO</a>
  65. <script>
  66. function jumpTo(ths,base){
  67. var val = ths.previousSibling.value;
  68. location.href = base + val;
  69. }
  70. </script>
  71. """ % (base_url,)
  72.  
  73. page_list.append(jump)
  74.  
  75. page_str = mark_safe("".join(page_list))
  76.  
  77. return page_str
  78.  
  79. from django.utils.safestring import mark_safe
  80. def user_list(request):
  81. current_page = request.GET.get('p', 1)
  82. current_page = int(current_page)
  83. page_obj = Page(current_page,len(LIST))
  84.  
  85. data = LIST[page_obj.start:page_obj.end]
  86.  
  87. page_str = page_obj.page_str("/user_list/")
  88.  
  89. return render(request, 'user_list.html', {'li': data,'page_str': page_str})

4.Django模板语言和分页的更多相关文章

  1. 26.Django模板语言和分页

    继承 extends 子版只能继承一个父模板 1.父模板 master.html <!DOCTYPE html> <html lang="en"> < ...

  2. 6月15日 python学习总结 Django模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  3. Django模板语言初识

    一.Django框架简介 1.MVC框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控 ...

  4. Django模板语言的复用

    一.include标签 由于在项目中,往往会出现多个页面拥有一个或几个相同的页面版块,或是一个页面多个页面版块是相同的,基于这个问题,我们可以采用模板语言复用include标签来帮我们解决,这样就避免 ...

  5. Django模板语言相关内容 Djan

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  6. Django——模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  7. Django 模板语言 路由 视图

    . 模板语言(字符串替换) . 母版和继承 . 什么时候用母版? html页面有重复的代码,把它们提取出来放到一个单独的html文件. (比如:导航条和左侧菜单) . 子页面如何使用母版? {% ex ...

  8. django模板语言的注释

    就像HTML或者Python,Django模板语言同样提供代码注释. 注释使用 {# #} : ? 1 {# This is a comment #} 注释的内容不会在模板渲染时输出. 用这种语法的注 ...

  9. Django模板语言(常用语法规则)

    Django模板语言 The Django template language 模板中常用的语法规则 {最新版本的Django语法可能有改变,不支持的操作可能支持了.[HTML教程 - 基本元素/标签 ...

随机推荐

  1. 前端工具mock的使用 - 造数据模拟网络请求

    前后端同步开发过程中,有时候前端页面完成了,需要等待后端接口完成部署后才能联调. 这个时候如果不想等待,想自己造数据模拟网络请求,这种情况就能用到mock工具了. mock工具可以用在web网站,也能 ...

  2. linux swap空间的swappiness=0

    linux 会使用硬盘的一部分做为SWAP分区,用来进行进程调度--进程是正在运行的程序--把当前不用的进程调成‘等待(standby)‘,甚至‘睡眠(sleep)’,一旦要用,再调成‘活动(acti ...

  3. 二维条码扫描模组在肯德基KFC的无纸化点餐解决方案

    在如今提倡节约资源的环境下,肯德基在品牌发展中,逐渐实现无纸化点餐,不仅节约了纸质点餐单,而且还具有节约资源的示范作用.而其中二维码扫描模组是这套无纸化点餐方案的重点,在整套设备中,加入二维码扫描模组 ...

  4. android studio 开发免安装的app之目录结构

    尚未深入分析,暂且外链到我看到的,对此有帮助的博客,在此,感谢你们. 1.https://blog.csdn.net/tscyds/article/details/74331085 2.https:/ ...

  5. AI零基础入门之人工智能开启新时代—上篇

    人工智能的发展史及应用 开篇:人工智能无处不在 人工智能的发展历程 · 1945艾伦图灵在论文<计算机器不智能>中提出了著名的图灵测试,给人工智能的収展产生了深远的影响. · 1951年, ...

  6. [转]Unity-移动设备可用的压缩解压缩源码

    原文:http://www.manew.com/thread-103250-1-1.html 最近在做客户端数据的分离,不希望对项目有什么影响,也不太想用AssetBundle,太麻烦,就在网上找了找 ...

  7. :nth-child() 与 :nth-of-type(n)的区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Vue(二十八)el-cascader 动态加载 - 省市区组件

    1.后台接口为点击加载下一级 ,传省市区id <template> <el-cascader v-model="selectedOptions" placehol ...

  9. 4.28Linux(6)

    2019-4-28 21:27:41 明天回家.回家继续学Linux还好有个服务器!!!感觉有个属于自己的服务器感觉好爽啊!! 越努力越幸运!永远不要高估自己!!! Nginx安装 服务器的请求原理 ...

  10. 【原创】XAF 常见错误以及对应解决方法

    1.Appearance Criteria设置错误 Exception occurs while assigning the 'DetailView, ID:xxx_DetailView' view ...