1.初识路由系统

  路由系统是用户发请求到URL,然后URL根据路由系统重新指向到函数名的一个对应关系

2.创建project和app

  1.   django-admin startproject mysite
  2.   cd mysite
  3.   python manage.py startapp appd01

3.在项目的urls.py中定义路由关系,逻辑关系在views.py中。

  views.py

  1. from django.shortcuts import render
  2. from django.shortcuts import HttpResponse
  3.  
  4. # Create your views here.
  5. def f1(request):
  6. return HttpResponse('OK')
  7.  
  8. def login(request):
  9. return HttpResponse('Login')
  10.  
  11. def detail(request,nid):
  12. print (nid)
  13. return HttpResponse('Detail')
  14.  
  15. def detail2(request,nid,nnid):
  16. print (nid,nnid)
  17. return HttpResponse('Detail2')
  18.  
  19. def detail3(request,n1,n2):
  20. print (n1,n2)
  21. return HttpResponse('Detail3')

  urls.py

  1. from app01 import views
  2.  
  3. urlpatterns = [
  4. # url(r'^admin/', admin.site.urls),
  5. url(r'^index/', views.f1),
  6. url(r'^login/', views.login),
  7. url(r'^login2/', views.login),
  8. url(r'^detail/(\d+)/', views.detail),
  9. url(r'^detail2/(\d+)/(\d+)/', views.detail2),
  10. url(r'^detail3/(?P<n1>\d+)/(?P<n2>\d+)/', views.detail3),
  11. ]

4.路由系统之分页

 urls.py中定义页面与函数的对应关系

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from django.shortcuts import HttpResponse
  4. from app01 import views
  5.  
  6. urlpatterns = [
  7. # url(r'^admin/', admin.site.urls),
  8. # url(r'^index/', views.f1),
  9. url(r'^login/', views.login),
  10. url(r'^login2/', views.login),
  11. url(r'^detail/(\d+)/', views.detail),
  12. url(r'^detail2/(\d+)/(\d+)/', views.detail2),
  13. url(r'^detail3/(?P<n1>\d+)/(?P<n2>\d+)/', views.detail3),
  14. url(r'^index/(\d+)/', views.index),
  15. ]

  定义views.py

  1. from django.shortcuts import render
  2. from django.shortcuts import HttpResponse
  3.  
  4. # Create your views here.
  5. def f1(request):
  6. return HttpResponse('OK')
  7.  
  8. def login(request):
  9. return HttpResponse('Login')
  10.  
  11. def detail(request,nid):
  12. print (nid)
  13. return HttpResponse('Detail')
  14.  
  15. def detail2(request,nid,nnid):
  16. print (nid,nnid)
  17. return HttpResponse('Detail2')
  18.  
  19. def detail3(request,n1,n2):
  20. print (n1,n2)
  21. return HttpResponse('Detail3')
  22.  
  23. USER_LIST = []
  24. for item in range(94):
  25. temp = {'id':item,'username':'alex'+str(item),'email':'email'+str(item)}
  26. USER_LIST.append(temp)
  27.  
  28. def index(request,page):
  29. page = int(page)
  30. start = (page -1)*10
  31. end = page*10
  32. user_list = USER_LIST[start:end]
  33. return render(request,'index.html',{'user_list':user_list})

  定义index.html页面

  1. <body>
  2. <table>
  3. <tr>
  4. <td>ID</td>
  5. <td>用户名</td>
  6. </tr>
  7. {% for item in user_list %}
  8. <tr>
  9. <td>{{ item.id }}</td>
  10. <td>{{ item.username }}</td>
  11. </tr>
  12. {% endfor %}
  13. </table>
  14. </body>

5.路由系统分页之详细信息

  urls.py

  1. url(r'^index/(\d+)/', views.index),
  2. url(r'^detail/(\d+)/',views.detail)

  views.py

  1. USER_LIST = []
  2. for item in range(94):
  3. temp = {'id':item,'username':'alex'+str(item),'email':'email'+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.  
  13. def detail(request,nid):
  14. nid = int(nid)
  15. user_list_dict = USER_LIST[nid]
  16. return render(request,'detail.html',{'user_list_dict':user_list_dict})

  index.html

  1. <body>
  2. <table>
  3. <tr>
  4. <td>ID</td>
  5. <td>用户名</td>
  6. </tr>
  7. {% for item in user_list %}
  8. <tr>
  9. <td>{{ item.id }}</td>
  10. <td>{{ item.username }}</td>
  11. <td><a href="/detail/{{ item.id }}">详细信息</a></td>
  12. </tr>
  13. {% endfor %}
  14. </table>
  15. </body>

  detail.html

  1. <body>
  2. <ul>
  3. <li>{{ user_list_dict.id }}</li>
  4. </ul>
  5. <ul>
  6. <li>{{ user_list_dict.username }}</li>
  7. </ul>
  8. <ul>
  9. <li>{{ user_list_dict.email }}</li>
  10. </ul>
  11. </body>

6.路由分发系统

  加入我们按照系统的模块来分,前端的访问界面用web字段开头,后面的管理模块用manager字段开头,那么需要定义两个虚拟主机,一个app01,一个manager01。

  那么在项目s13day18_django中定义urls.py的时候就需要定义两个虚拟主机的映射关系,这时,可以在单独的虚拟主机中也定义对应的urls.py。

  s13day18_django.urls.py

  1. from django.conf.urls import url, include
  2. from django.conf.urls import url
  3. from django.contrib import admin
  4. from django.shortcuts import HttpResponse
  5. from app01 import views
  6.  
  7. urlpatterns = [
  8. url(r'^web/', include('app01.urls')),
  9. url(r'^manager/',include('manager01.urls'))
  10. ]

  app01.urls.py

  1. urlpatterns = [
  2. url(r'^index/(\d+)/', views.index),
  3. url(r'^detail/(\d+)/',views.detail)
  4. ]

  manager01.urls.py未定义

  app01.views.py

  1. USER_LIST = []
  2. for item in range(94):
  3. temp = {'id':item,'username':'alex'+str(item),'email':'email'+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.  
  13. def detail(request,nid):
  14. nid = int(nid)
  15. user_list_dict = USER_LIST[nid]
  16. return render(request,'detail.html',{'user_list_dict':user_list_dict})

  templates下面的index.html

  1. <body>
  2. <table>
  3. <tr>
  4. <td>ID</td>
  5. <td>用户名</td>
  6. </tr>
  7. {% for item in user_list %}
  8. <tr>
  9. <td>{{ item.id }}</td>
  10. <td>{{ item.username }}</td>
  11. <td><a href="/web/detail/{{ item.id }}">详细信息</a></td>
  12. </tr>
  13. {% endfor %}
  14. </table>
  15. </body>

  以及detail.html

  1. <body>
  2. <ul>
  3. <li>{{ user_list_dict.id }}</li>
  4. </ul>
  5. <ul>
  6. <li>{{ user_list_dict.username }}</li>
  7. </ul>
  8. <ul>
  9. <li>{{ user_list_dict.email }}</li>
  10. </ul>
  11. </body>

  以后访问app01或者manager01的APP的时候,需要访问页面中输入http://127.0.0.1:8000/web/index/7/或者http://127.0.0.1:8000/manager/...

7.模板语言

  在模板语言中使用render传递的变量

  1. {{ k1 }}
  2. {{ k2.0 }}
  3.  
  4. {% for item in k2 %}
  5. <p>{{ item}},{{ forloop.counter }},{{ forloop.counter0 }},{{ forloop.first }},{{ forloop.last }},{{ forloop.revcounter }}</p>
  6. {% endfor %}
  7.  
  8. {% if k1 == 'v1' %}
  9. <h1>V1</h1>
  10. {% elif k1 == 'v2' %}
  11. <h1>V2</h1>
  12. {% else %}
  13. <h1>OTHER</h1>
  14. {% endif %}

  在模板语言中如何使用自定义函数

  a.创建指定文件夹,名称不能改templatetags

  b.创建任意.py文件,写函数,返回值register不能变

  1. from django import template
  2. from django.utils.safestring import mark_safe
  3. from django.template.base import Node,TemplateSyntaxError
  4. register = template.Library()
  5.  
  6. @register.filter
  7. def f1(value):
  8. return value+''

  c.在HTML文件的开头导入自定义模块,并且在HTML文件中使用函数

  1. {% load xx %}
  2.  
  3. ......
  1. <body>
    {{ k1|f1 }}
    </body>

  d.在项目的settings.py中注册app01

  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. ]

  这样就可以在模板中使用自定义的函数了。但是在filter模式中,我们只能传递一个参数,如果要传递多个参数,可以自行分解传递的第一个参数,或者使用simple_tag的方式来处理。

  使用simple_tag,只需要在原有的基础上修改装饰器的名字,然后调用方式修改一下。

  1. @register.simple_tag
  2. def f2(s1,s2,s3,s4):
  3. return s1+s2+s3+s4
  1. {% f2 1 2 3 4 %}  //f2是函数名,1 2 3 4分别是传递过来的4个参数

  filter可以支持模板语言的if条件,simple_tag不支持

  在xx.py中定义

  1. @register.filter
  2. def f3(value):
  3. if value == 'VVV':
  4. return True
  5. else:
  6. return False

  在template.html中定义

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

8.模板

  假设我们有一个如下的样示:

  每次点用户管理的时候,用户管理被选中,并且右侧栏显示用户管理的内容,点击资产管理的时候,资产管理被选中,并且右侧栏显示资产管理的内容。最简单的做法是分别再两个页面中添加active的属性,并且显示值。

  userinfo.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .pg-header{
  8. height: 48px;
  9. background-color: blue;
  10. }
  11.  
  12. .pg-body{
  13. min-height: 500px;
  14. }
  15. .pg-body .body-menu{
  16. width: %;
  17. float: left;
  18. }
  19. .pg-body .body-content{
  20. width: %;
  21. float: left;
  22. }
  23. .pg-footer{
  24. height: 100px;
  25. background-color: brown;
  26. }
  27. .active{
  28. background-color: blueviolet;
  29. color: white;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div class="pg-header"></div>
  35. <div class="pg-body">
  36. <div class="body-menu">
  37. <ul>
  38. <li><a href="/web/userinfo" class="active">用户管理</a></li>
  39. <li><a href="/web/assets">资产管理</a></li>
  40. </ul>
  41. </div>
  42. <div class="body-content">
  43. <table border="" solid red>
  44. {% for item in user_list %}
  45. <tr>
  46. <td>{{ item.username }}</td>
  47. <td>{{ item.sexy }}</td>
  48. </tr>
  49. {% endfor %}
  50. </table>
  51. </div>
  52. </div>
  53. <div class="pg-footer"></div>
  54. </body>
  55. </html>

  assets.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .pg-header{
  8. height: 48px;
  9. background-color: blue;
  10. }
  11.  
  12. .pg-body{
  13. min-height: 500px;
  14. }
  15. .pg-body .body-menu{
  16. width: %;
  17. float: left;
  18. }
  19. .pg-body .body-content{
  20. width: %;
  21. float: left;
  22. }
  23. .pg-footer{
  24. height: 100px;
  25. background-color: brown;
  26. }
  27. .active{
  28. background-color: blueviolet;
  29. color: white;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div class="pg-header"></div>
  35. <div class="pg-body">
  36. <div class="body-menu">
  37. <ul>
  38. <li><a href="/web/userinfo">用户管理</a></li>
  39. <li><a href="/web/assets" class="active">资产管理</a></li>
  40. </ul>
  41. </div>
  42. <div class="body-content">
  43. <table border="" solid red>
  44. {% for item in assets_list %}
  45. <tr>
  46. <td>{{ item.hostname }}</td>
  47. <td>{{ item.port }}</td>
  48. </tr>
  49. {% endfor %}
  50. </table>
  51. </div>
  52. </div>
  53. <div class="pg-footer"></div>
  54. </body>
  55. </html>

  可以看到,在两段代码中有大量的重用。并且一旦修改,所有页面都要修改,有没有像函数一样可以导入的方式呢,把不变化的内容创建一个模板layout.html。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .pg-header{
  8. height: 48px;
  9. background-color: blue;
  10. }
  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: blueviolet;
  29. color: white;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div class="pg-header"></div>
  35. <div class="pg-body">
  36. <div class="body-menu">
  37. <ul>
  38. <li><a href="/web/userinfo">用户管理</a></li>
  39. <li><a href="/web/assets">资产管理</a></li>
  40. </ul>
  41. </div>
  42. <div class="body-content">
  43. {% block body %}{% endblock %}
  44. </div>
  45. </div>
  46. <div class="pg-footer"></div>
  47. </body>
  48. </html>

  assets.html

  1. {% extends "layout.html" %}
  2. {% block body %}
  3. <table border="1" solid red>
  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 body %}
  3. <table border="1" solid red>
  4. {% for item in user_list %}
  5. <tr>
  6. <td>{{ item.username }}</td>
  7. <td>{{ item.sexy }}</td>
  8. </tr>
  9. {% endfor %}
  10. </table>
  11. {% endblock %}

  使用上面的方法之后,可以正常的显示页面了,但是选中菜单确没有了。有两种方式可以添加选中菜单,一种依旧是定义一个block,然后重写,另外一种就是给layout里面的元素添加ID,然后通过JS来访问。

  layout.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <style>
  7. .pg-header{
  8. height: 48px;
  9. background-color: blue;
  10. }
  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: blueviolet;
  29. color: white;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div class="pg-header"></div>
  35. <div class="pg-body">
  36. <div class="body-menu">
  37. <ul>
  38. <li><a id="userinfo" href="/web/userinfo">用户管理</a></li>
  39. <li><a id="assets" href="/web/assets">资产管理</a></li>
  40. {% block js %}{% endblock %}
  41. </ul>
  42. </div>
  43. <div class="body-content">
  44. {% block body %}{% endblock %}
  45. </div>
  46. </div>
  47. <div class="pg-footer"></div>
  48. </body>
  49. </html>

  userinfo.html

  1. {% extends "layout.html" %}
  2. {% block body %}
  3. <table border="1" solid red>
  4. {% for item in user_list %}
  5. <tr>
  6. <td>{{ item.username }}</td>
  7. <td>{{ item.sexy }}</td>
  8. </tr>
  9. {% endfor %}
  10. </table>
  11. {% endblock %}
  12.  
  13. {% block js %}
  14. <script>
  15. document.getElementById("userinfo").className="active";
  16. </script>
  17. {% endblock %}

  assets.html

  1. {% extends "layout.html" %}
  2. {% block body %}
  3. <table border="1" solid red>
  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 %}
  12.  
  13. {% block js %}
  14. <script>
  15. document.getElementById("assets").className="active";
  16. </script>
  17. {% endblock %}

  include的使用,假设在userinfo.html里面经常要使用多个对话框的时候,可以单独将多个对话框拿出来放在一个单独的html文件中,例如pizza.html

  1. <form>
  2. <input type="text">
  3. <input type="text">
  4. <input type="text">
  5. <input type="text">
  6. </form>

  然后要使用的时候,在userinfo.html中直接include即可:

  1. {% extends "layout.html" %}
  2. {% block body %}
  3. <table border="1" solid red>
  4. {% for item in user_list %}
  5. <tr>
  6. <td>{{ item.username }}</td>
  7. <td>{{ item.sexy }}</td>
  8. </tr>
  9. {% endfor %}
  10. </table>
  11. {% include "pizza.html" %}
  12. {% include "pizza.html" %}
  13. {% include "pizza.html" %}
  14. {% endblock %}
  15.  
  16. {% block js %}
  17. <script>
  18. document.getElementById("userinfo").className="active";
  19. </script>
  20. {% endblock %}

  

Python Django之路由系统的更多相关文章

  1. Python学习(三十一)—— Django之路由系统

    转载自:http://www.cnblogs.com/liwenzhou/p/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLc ...

  2. 6月19日 python学习总结 Django之路由系统

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

  3. python 之 Django框架(路由系统、include、命名URL和URL反向解析、命名空间模式)

    12.36 Django的路由系统 基本格式: from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名) ...

  4. Django之路由系统 Dj

    Django之路由系统   Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调 ...

  5. Django框架----路由系统(详细)

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. ...

  6. Django之 路由系统

    Django的路由系统 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这 ...

  7. Django 基础 路由系统

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

  8. Django 的 路由系统

    Django 的路由系统 URL 配置(URLconf)就像Django 锁支撑网站的目录. 它的本质就是URL 与要为该URL 调用的视图函数之间的映射表. 你就是以这种方式告诉Django, 对于 ...

  9. Django 的路由系统

    Django 的路由系统   Django 的路由系统 路由层 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^$',views.ho ...

随机推荐

  1. Unity3D 发布无边框exe

    关于:Unity3D 发布无边框exe,Unity3D Build exe无边框 Unity发布windows版本 总是带着边框,很想给它去掉,笔者在网上查了一番,常见的有3中. 1:通过unity3 ...

  2. js 轮播图代码

    js代码 (function(){ /** parent //父容器 changeTime //每次间隔几秒切换下一条 leaveTime //鼠标从小图上离开过后几秒继续切换 index //从第几 ...

  3. Android FM模块学习之四源码分析(3)

    接着看FM模块的其他几个次要的类的源码.这样来看FM上层的东西不是太多. 请看android\vendor\qcom\opensource\fm\fmapp2\src\com\caf\fmradio\ ...

  4. RBL开发笔记三

    2014-08-26 20:06:24 今天就是在开发这个EPOLL来处理网络事件 封装较为健壮的EPOLL模型来处理基本的网络IO 1) 超时这个主题先没有弄 在开发EPOLL包括select/po ...

  5. Swiper说明&&API手册

    最近使用Swipe.js,发现中文的资料很少,试着翻译了一下.能力有限,翻译难免错漏,欢迎指出,多谢! 翻译自:http://www.idangero.us/sliders/swiper/api.ph ...

  6. NSDictionary读取数据类型异常问题.

    起因:做网络交互时,经常会使用JSON作为数据的承载体,本来是件好事,但是用多了,发现iOS侧偶尔会出现异常,几经比较发现是服务器给的数据有问题,该给INT的给按照STR给了,服务器能做动态更新,可客 ...

  7. jquery.cookie() 方法的使用(读取、写入、删除)

    一个轻量级的cookie 插件,可以读取.写入.删除 cookie. jquery.cookie.js 的配置 首先包含jQuery的库文件,在后面包含 jquery.cookie.js 的库文件. ...

  8. Sources

    作为一个初学者显然是没有能力自己写教程向的文章的 所以就写个整合资源贴整合一下自己学每个知识点的来源 (其实不是很全因为不记得之前看了什么) ————————————————————————————— ...

  9. wireshark如何抓取别人电脑的数据包

    抓取别人的数据包有几种办法,第一种是你和别人共同使用的那个交换机有镜像端口的功能,这样你就可以把交换机上任意一个人的数据端口做镜像,然后你在镜像端口上插根网线连到你的网卡上,你就可以抓取别人的数据了: ...

  10. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...