一、基于App的路由
作用:
根据App对路由规则进行分类,在全局urls.py包含某个项目的urls.py
示例
定义全局urls.py(全局路由系统)
#导入include from django.conf.urls import url,include from django.contrib import admin #导入app下的view函数 from learn import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^helloapp/',include('cmdb/urls')) #使用APP cmdb下的urls规则 ]
定义一个项目的urls.py(项目的路由系统)
from django.conf.urls import url,include from django.contrib import admin #导入app下的view函数 from . import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/',views.login), url(r'^index/',views.index), url(r'^reg/',views.reg), url(r'^layout/',views.layout), ]
定义views.py(视图函数)
from django.shortcuts import render,HttpResponse def index(request): # return HttpResponse('<h1>hello world!!!</h1>') return render(request,'index.html')
def login(request): return HttpResponse('login')
def reg(request): return HttpResponse('reg')
def layout(request): return HttpResponse('layout')
访问测试
http://127.0.0.1:8000/cmdb/admin/ http://127.0.0.1:8000/cmdb/layout/ http://127.0.0.1:8000/cmdb/login/ http://127.0.0.1:8000/cmdb/reg/ http://127.0.0.1:8000/cmdb/index/
二、动态路由(传一个参数)
作用
可以用来做分页,比如说访问一个博客网址:www.cnblogs.com/zhaijunming/1显示第1-10篇博客,访问www.cnblogs.com/zhaijunming/2显示第2-20篇博客
示例一:简单的说明动态路由
定义urls.py(路由系统)
from django.conf.urls import url from django.contrib import admin from learn import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^home/(\d+)/', views.home), #正则表达式中 \d 代表一个数字,+ 代表一个或多个前面的字符,写在一起 \d+ 就是一个或多个数字,用括号括起来的意思是保存为一个子组,每一个子组将作为一个参数,被 views.py 中的对应视图函数接收 ]
定义views.py(视图函数)
from django.shortcuts import render,HttpResponse # Create your views here. def home(request,num): #如果加正则表达式传参数的话,这里必须得有一个形式参数用来接收 print(num) return HttpResponse(num)
测试
http://127.0.0.1:8000/home/2
2
http://127.0.0.1:8000/home/1
1
示例二:利用路由系统的动态参数功能做分页
定义urls.py
from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^index/(\d+)/', views.index), url(r'^detail/(\d+)/', views.detail), ]
定义views.py
from django.shortcuts import render from django.shortcuts import HttpResponse # Create your views here. #定义一个空列表,存放用户信息 USER_LIST = [] #模拟生成94条用户信息, 如: id:1,username:alex1,email:alex1 for item in range(94): temp = {'id':item,'username':'alex'+str(item),'email':'alex'+str(item)} USER_LIST.append(temp) #分页显示选项的函数 def index(request,page): page = int(page) start = (page - 1 ) * 10 #假如用户输入127.0.0.1/index/5,这里就是40 end = page * 10 #这里就是50 user_list = USER_LIST[start:end] #列表的切片功能,获取列表里索引为40-50的内容 return render(request,'index.html',{'user_list':user_list}) #把获取到列表里索引为40-50的内容传到模板中 #显示某个选项的所有信息 def detail(request,nid): nid = int(nid) #假如用户输入127.0.0.1/detail/5, 这里的nid就是5 current_detail_dict = USER_LIST[nid] #找到列表里索引为5的值 return render(request,'detail.html',{'current_detail_dict':current_detail_dict}) #把获取到索引为5的值传到模板
定义index.html模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table> <tr> <td>ID</td> <td>用户名</td> <td>详细信息</td> </tr> {% for item in user_list %} <tr> <td>{{ item.id }}</td> <td>{{ item.username }}</td><td><a href="/detail/{{ item.id }}">查看详细</a></td> {#点击查看详细就跳转到类似于/datail/5的页面#} </tr> {% endfor %} </table> </body> </html>
定义detail.html模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {# 比如获取到列表里索引为5的值,那就是这样的{'id':5,'username':alex5,'email':alex5}#} {# 因为视图函数里是列表嵌套字典:[{'id':1,'username':alex1,'email':alex1},{'id':2,'username':alex2,'email':alex2}]#} <ul> <li> {{ current_detail_dict.id }} </li> <li> {{ current_detail_dict.username }} </li> <li> {{ current_detail_dict.email }} </li> </ul> </body> </html>
效果演示