Django学习系列之路由系统

一、基于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>

效果演示

 

posted @ 2016-12-24 21:49  差点点温柔  阅读(306)  评论(0编辑  收藏  举报