路由系统

Django页面详情以及分页

举个例子:

有一组后台数据,需要展示到页面上,但由于数据量较大,那就需要做分页了吧,那么怎么才能将页面详情和分页都融合进去呢,Django里的路由系统加上正则表达式可以满足:

项目中的views.py,需要注意的是要传入页面的参数:

  1. USER_LIST=[]
  2. for item in range(94):
  3. temp = {"id":item,"username":'alex'+str(item),"email":'alexemail'+str(item)}
  4. USER_LIST.append(temp)
  5. #传入第几页的参数
  6. def index(request,page):
  7. page=int(page)
  8. start=(page-1)*10
  9. end=page*10
  10. user_list=USER_LIST[start:end]
  11. return render(request,'index.html',{"user_list":user_list})
  12. #传入数据库中ID的参数,方便指定具体的数据
  13. def detail(request,nid):
  14. nid=int(nid)
  15. current_user_dict=USER_LIST[nid]
  16. return render(request,'detail.html',{'current_user_dict':current_user_dict})

项目中的urls.py:

  1. from django.contrib import admin
  2. from django.conf.urls import url, include
  3. from app01 import views
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6. url(r'^index/(\d+)', views.index),
  7. url(r'^detail/(\d+)', views.detail),
  8. ]

tempaltes中页面:

index.html :

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>index</title>
  6. </head>
  7. <body>
  8. <table>
  9. <tr>
  10. <td>ID</td>
  11. <td>用户名</td>
  12. <td>详细</td>
  13. </tr>
  14. {% for item in user_list %}
  15. <tr>
  16. <td>{{ item.id }}</td>
  17. <td>{{ item.username }}</td>
  18. <td><a href="/detail/{{ item.id }}/">查看详情</a></td>
  19. </tr>
  20. {% endfor %}
  21. </table>
  22. </body>
  23. </html>

detail.html :

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>detail</title>
  6. </head>
  7. <body>
  8. <ul>
  9. <li>{{ current_user_dict.id }}</li>
  10. <li>{{ current_user_dict.username }}</li>
  11. <li>{{ current_user_dict.email }}</li>
  12. </ul>
  13. </body>
  14. </html>

urls.py 动态关系

django中的路由还支持正则表达式和正则表达式的分组,可以这么搞,很多时候用来处理分页和一些URL分配,看下例子:

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. url(r'^detail/(\d+)/', views.detail),
  4. url(r'^detail2/(\d+)/(\d+)/', views.detail2),
  5. url(r'^detail3/(?P<p1>\d+)/(?P<x2>\d+)/', views.detail3),
  6. ]

这里需要重点说明一点:urls.py中路径的"/"可加可不加,如不加,页面访问时Django会自动加根号处理

views.py 中的配置:


  1. def detail(request,id):
  2. print(id)
  3. return HttpResponse('ok')
  4. def detail2(request,nid,nnid):
  5. print(nid,nnid)
  6. return HttpResponse('ok')
  7. def detail3(request,p1,x2):
  8. print(p1,x2)
  9. return HttpResponse('ok')

配置时需要注意后面带上参数,否则会报错.

路由分组:include导入配置文件

如果项目APP较多,为了合理分配,我们可以使用分组的概念,urls.py中的include.

比如,我们有APP叫app01,app02,app03,但为了更好的区分管理各个应用中的url,我们引入include,但首先,需要导入此模块:

  1. from django.conf.urls import url, include
  2. from app01 import views
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. #配置下面,利用web区分其他其他应用,名称随便改
  6. url(r'^web/', include('app01.urls')),
  7. ]

然后在app01目录中创建urls.py文件:

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from django.conf.urls import url
  4. from app01 import views
  5. urlpatterns = [
  6. url(r'^template', views.template),
  7. url(r'^assets', views.assets),
  8. url(r'^userinfo', views.userinfo),
  9. url(r'^ajax_demo', views.ajax_demo),
  10. ]

模板

模板的渲染

Django中的模板语言比较简洁,能在浏览器中看到比较复杂的页面,就因为有渲染,源码如下:

模板语言

模板的语言比较多:

  1. {{ item }}
  2. {% for item in item_list %} <a>{{ item }}</a> {% endfor %}
  3.   forloop.counter
  4.   forloop.first
  5.   forloop.last
  6.   
  7. {% if ordered_warranty %} {% else %} {% endif %}
  8. 母板:{% block title %}{% endblock %}
  9. 子板:{% extends "base.html" %}
  10.    {% block title %}{% endblock %}
  11.    
  12. 帮助方法:
  13. {{ item.event_start|date:"Y-m-d H:i:s"}}
  14. {{ bio|truncatewords:"30" }}
  15. {{ my_list|first|upper }}
  16. {{ name|lower }}

看个例子:

  1. {{ k1 }}
  2. {{ k2.1 }}
  3. {{ k3.name }}
  4. {% for item in k2 %}
  5. <p>{{ item }},{{ forloop.counter }},{{ forloop.counter0 }},{{ forloop.first }},{{ forloop.last }},{{ forloop.revcounter }}</p>
  6. {% endfor %}
  7. {% if k1 == 'v1' %}
  8. <h1>V1</h1>
  9. {% elif k1 == 'v2' %}
  10. <h1>V2</h1>
  11. {% else %}
  12. <h1>7777</h1>
  13. {% endif %}
  14. {{ k1 }}
  15. {{ k1|lower }}
  16. {{ k1|f1:"alex,123" }}
  17. {% f2 1 2 3 4 %}
  18. {% if k1|f3 %}
  19. <h1>True</h1>
  20. {% else %}
  21. <h1>False</h1>
  22. {% endif %}

模板语言中的索引

但需要注意的是,索引取值时候,是按照.来取值的:

  1. 一个列表:li=[11,22,33,44,55]
  2. 取列表中的索引为第三的元素:li.2
  3. 一个字典:dict={'a':1,'b':2,}
  4. 取列表中的元素:dict.a

模板语言中循环中的forloop

在模板中的for循环中,有一个forloop语言:

  1.   forloop.counter 取列表中元素对应的索引值,从1开始
  2.   forloop.first 判断是否是循环的第一个,对应值为True,False
  3.   forloop.last 判断是否循环中的最后一个元素
  4.   forloop,counter0 取列表中元素对应的索引值,从0开始
  5.   forloop.revcounter 取列表中元素对应的索引值,但是反序列的,从最后一个开始

看下例子吧:

test.html 文件:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>test_template_lanauge</title>
  6. </head>
  7. <body>
  8. {% for item in li %}
  9. <p>{{ item }},{{ forloop.counter }},{{ forloop.counter0 }},
  10. {{ forloop.first }},{{ forloop.last }},{{ forloop.revcounter }}</p>
  11. {# <p>{{ forloop.counter }}</p>#}
  12. {# <p>{{ forloop.counte0 }}</p>#}
  13. {# <p>{{ forloop.revcounter }}</p>#}
  14. {% endfor %}
  15. </body>
  16. </html>

views.py 中的数据:

  1. def test(request):
  2. li = ['alex','cc','dd','abc','123','sdfs','sdfsf','sdfsdf']
  3. return render(request,'test.html',{'li':li})

页面中的显示内容:

  1. alex,1,0, True,False,8
  2. cc,2,1, False,False,7
  3. dd,3,2, False,False,6
  4. abc,4,3, False,False,5
  5. 123,5,4, False,False,4
  6. sdfs,6,5, False,False,3
  7. sdfsf,7,6, False,False,2
  8. sdfsdf,8,7, False,True,1

模板中的判断语句

这个比较简单了:

  1. {% if k1|f3 %}
  2. <h1>True</h1>
  3. {% else %}
  4. <h1>False</h1>
  5. {% endif %}

更多内置方法

  1. {{ item.event_start|date:"Y-m-d H:i:s"}}
  2. {{ bio|truncatewords:"30" }}
  3. {{ my_list|first|upper }}
  4. {{ name|lower }}

自定义方法

自定义方法有两种:simple_tagfilter

自定义方法 参数限制 是否支持if判断语句
filter 有限制,只能传入1个,但可以通过字符串然后split来解决 支持if判断语句
simple-tag 参数无限制 不支持if判断语句

自定义方法步骤:

  1. 在项目目录下创建指定文件,名称不能改:templatetags

  2. 在templatetags目录中创建任意py文件,比如xx.py,代码如下:


    1. from django import template
    2. from django.utils.safestring import mark_safe
    3. #此行如有问题,可以删除
    4. #from django.template.base import resolve_variable, Node, TemplateSyntaxError
    5. # 必须不变
    6. register = template.Library()
    7. # 创建函数
    8. @register.filter
    9. def f1(value):
    10. return value + "666"
    11. @register.simple_tag
    12. def f2(s1,s2,s3,s4):
    13. return s1+s2+s3+s4
  3. html页面头部导入

    1. {% load xx %}
  4. 在HTML页面中使用自定义方法:

    1. {% load xx %}
    2. <!DOCTYPE html>
    3. <html lang="en">
    4. <head>
    5. <meta charset="UTF-8">
    6. <title>Title</title>
    7. </head>
    8. <body>
    9. {% if k1|f3 %}
    10. <h1>True</h1>
    11. {% else %}
    12. <h1>False</h1>
    13. {% endif %}
    14. </body>
    15. </html>
  5. 在setting.py 中注册app

    1. INSTALLED_APPS = [
    2. 'django.contrib.admin',
    3. 'django.contrib.auth',
    4. 'django.contrib.contenttypes',
    5. 'django.contrib.sessions',
    6. 'django.contrib.messages',
    7. 'django.contrib.staticfiles',
    8. 'app01',
    9. ]

模板的继承

母板:

  1. balabala...
  2. {% block 名称 %} {% endblock %}
  3. balabala...

子板,需要声明:{% extends '母板html文件名' %}:

  1. {% extends '母板html文件名' %}
  2. {% block 名称 %}
  3. 具体子页面的内容...
  4. {% endblock %}

后台管理页面例子

一般后台管理页面分为好3-4个部分,header/body/footer,body中又包括左侧菜单栏和右侧内容部分.

views.py 中的内容:

  1. def assets(request):
  2. assets_list=[]
  3. for i in range(10):
  4. temp={'hostname':'h1'+str(i),'port':80}
  5. assets_list.append(temp)
  6. return render(request,'assets.html',{'assets_list':assets_list})
  7. def userinfo(request):
  8. user_list=[]
  9. for i in range(10):
  10. temp={'username':'h1'+str(i),'salary':80}
  11. user_list.append(temp)
  12. return render(request,'userinfo.html',{'user_list':user_list})

母板:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <link rel="stylesheet" href="..." />
  7. <style>
  8. .pg-header{
  9. height: 48px;
  10. background-color: cadetblue;
  11. }
  12. .pg-body{
  13. min-height: 500px;
  14. }
  15. .pg-body .body-menu{
  16. width: 20%;
  17. float: left;
  18. }
  19. .pg-body .body-content{
  20. width: 80%;
  21. float: left;
  22. }
  23. .pg-footer{
  24. height: 100px;
  25. background-color: brown;
  26. }
  27. .active{
  28. background-color: aquamarine;
  29. color: white;
  30. }
  31. </style>
  32. {% block css %}{% endblock %}
  33. </head>
  34. <body>
  35. <div class="pg-header">
  36. 后台系统V1
  37. </div>
  38. <div class="pg-body">
  39. <div class="body-menu">
  40. <ul>
  41. <li><a href="/web/userinfo">用户管理</a></li>
  42. <li><a href="/web/assets">资产管理</a></li>
  43. </ul>
  44. </div>
  45. <div class="body-content">
  46. {% block body %}{% endblock %}
  47. </div>
  48. </div>
  49. <div class="pg-footer"></div>
  50. <script src="xxx"></script>
  51. {% block js %}{% endblock %}
  52. </body>
  53. </html>

子板 assets.html:

  1. {% extends 'layout.html' %}
  2. {% block body %}
  3. <table>
  4. {% for item in assets_list %}
  5. <tr>
  6. <td>{{ item.hostname }}</td>
  7. <td>{{ item.port }}</td>
  8. </tr>
  9. {% endfor %}
  10. </table>
  11. {% endblock %}

子板 userinfo.html:

  1. {% extends 'layout.html' %}
  2. {% block css %}
  3. <style></style>
  4. {% endblock %}
  5. {% block body %}
  6. <ul>
  7. {% for item in user_list %}
  8. <li>{{ item.username }},{{ item.salary }}</li>
  9. {% endfor %}
  10. </ul>
  11. {% endblock %}
  12. {% block js %}
  13. <script>
  14. document.getElementById('userinfo').className = 'active';
  15. </script>
  16. {% endblock %}

include小组件

页面中难免出现重复利用的小图片页面之类的,所以出现了组件这个概念,类似于python中的模块概念,很简单,直接在页面中载入即可.

比如,需求模板:

  1. {% extends 'layout.html' %}
  2. {% block body %}
  3. <table>
  4. {% for item in assets_list %}
  5. <tr>
  6. <td>{{ item.hostname }}</td>
  7. <td>{{ item.port }}</td>
  8. </tr>
  9. {% endfor %}
  10. </table>
  11. {% include 'son.html' %}
  12. {% include 'son.html' %}
  13. {% include 'son.html' %}
  14. {% include 'son.html' %}
  15. {% include 'son.html' %}
  16. {% include 'son.html' %}
  17. <h3></h3>
  18. {% endblock %}
  19. {% block js %}
  20. <script>
  21. document.getElementById('assets').className = 'active';
  22. </script>
  23. {% endblock %}

组件模板son.html:

  1. <form>
  2. <input />
  3. <input />
  4. <input />
  5. <input />
  6. </form>

Django补充之模板语言的更多相关文章

  1. 第三百一十节,Django框架,模板语言

    第三百一十节,Django框架,模板语言 模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到h ...

  2. Django框架 之 模板语言

    Django框架 之 模板语言 浏览目录 标签 过滤器 一.标签 Tags 1.普通变量 普通变量用{{ }} 变量名由数字.字母.下划线组成 点.在模板语言中用来获取对象相应的属性值 示例: 1 2 ...

  3. Python学习笔记整理总结【Django】:模板语言、分页、Cookie、Session

    一.模板语言  1.在前段展示:对象/字典/元组 class Business(models.Model): # id #用默认的自增id列 即:Business中有3列数据(id, caption, ...

  4. django基础 -- 4. 模板语言 过滤器 模板继承 FBV 和CBV 装饰器 组件

    一.语法 两种特殊符号(语法): {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 二.变量 1. 可直接用  {{ 变量名 }} (可调用字符串, 数字 ,列表,字典,对象等) ...

  5. Django Template Language 模板语言

    一.标签 tags 1.普通变量 普通变量用{{ }} 变量名由数字.字母.下划线组成 点.在模板语言中用来获取对象相应的属性值 示例 {# 取variable中的第一个参数 #} {{ variab ...

  6. 八 Django框架,模板语言

    模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到html用模板语言渲染 {{...}}接收一 ...

  7. [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)

    一.实现一个简单的Web服务器 使用Python标准库提供的独立WSGI服务器来实现MVC架构. 首先,实现一个简单的Web服务器: from wsgiref.simple_server import ...

  8. Python Django 之 Template 模板语言简介

    一.什么事模板语言 html+逻辑控制语句 二.模板语言的作用 帮助前端处理后端发来的数据,方便前端展示(杂糅渲染) 三.模板语言语法 1.{{变量}} 变量使用双大括号{{}} 2.万能的句点号. ...

  9. Python开发【Django】:模板语言

    排序 1.forloop.counter 表示循环的次数,它从1开始计数,第一次循环设为1 {% for item in todo_list %} <p>{{ forloop.counte ...

随机推荐

  1. JDBC课程3--通过ResultSet执行查询操作

    内容:  ResultSet 结果集,封装了使用JDBC 进行查询;JDBCTools.release(rs,st, conn); 这个模块进行了更新, 同时结束的时候也关闭ResultSet,结束该 ...

  2. 云计算(7)---the scheduler of Hadoop

    The scheduler of Hadoop Programming MapReduce 在有些情况下,reducer也可以先开始于Map.但为了便于理解,在这儿我们都是使reduce不会早于map ...

  3. kombu在redis中的键值名

    参考flower源码 取队列名,发送到求数量的函数中 queue_names = ControlHandler.get_active_queue_names() queues = yield brok ...

  4. LightOJ - 1148-Mad Counting (数学)

    链接: https://vjudge.net/problem/LightOJ-1148 题意: Mob was hijacked by the mayor of the Town "Trut ...

  5. 怎能使用echo 输出对象

     class A{         function __toString() {             return "怎么使用echo输出对象";          }   ...

  6. jquery做个折叠面板

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

  7. Ubuntu14.04系统显示器不自动休眠修改

    -----设置Ubuntu14.04不自动锁屏,常亮 右上角的菜单打开system setting ----- brightness&lock按钮 1. 2. 参考: https://blog ...

  8. JavaScript 判断是否为空

    // var a = ""; // var a = " "; // var a = null; // var a = undefined; // var a = ...

  9. Java枚举抽象方法实战

    需求背景 需求已经确定了几个固定的常量值,并且每个常量值都有相同的行为,但是具体实现细节不同.建议使用枚举抽象方法,优点:结构清晰,便于扩展. 枚举类实现抽象方法 与常规抽象类一样,enum类允许我们 ...

  10. nodejs爬虫案例笔记

    用nodeJs制作一个简单的网页爬虫 主要分为三个步骤,向目标请求数据,处理数据,打印数据.需要用到的模块有http,cheerio. 1.准备步骤,引入要使用的模块 2.向目标请求数据 http.g ...