码迷,mamicode.com
首页 > 其他好文 > 详细

Django进阶-路由系统

时间:2018-10-01 21:05:38      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:数据   import   不同的   a标签   列表   views   正则表达式:   namespace   space   

概述

URL配置就像Django所支撑网站的目录
本质:URL与视图函数的映射表

Django2.0

from django.urls import path
url 换成了 path

基本格式

from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数,参数,别名),
]
正则表达式:        一个正则表达式字符串
views视图函数:        一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
参数:                可选的要传递给视图函数的默认参数(字典形式)
别名:                一个可选的name参数

通过URL给视图函数传参

分组匹配和分组命名匹配, 一个正则规则里只能选一个

通过?传值

<a href="/del_publisher/?id={{ publisher.id }}" class="btn btn-danger">删除</a>

取值

request.GET.get("id", None)
技术分享图片
def del_publisher(request):
    print(request.GET)
    del_id = request.GET.get("id", None)        # 获取到用户要删除的数据的ID
    if del_id:
        del_obj = models.Publisher.objects.get(id=del_id)     # 找到要删除的那条数据
        del_obj.delete()          # 删除找到的那条数据
        return redirect("/publisher_list/")     # 返回到出版社列表的页面
    else:
        return HttpResponse("找不到要删除的数据")
views

分组匹配(按位置传)

url(r‘^test30/([a-zA-Z]+)/(\d+)/$‘, views.test20)

视图函数里按照位置接收

技术分享图片
def test20(request, name, id):        # name是第一个分组, id是第二个分组
    return HttpResponse("name:{} id:{}".format(name, id))
views.py

分组命名匹配

url(r‘^test20/(?P<name>[a-zA-Z]+)/(?P<id>\d+)/$‘, views.test20)

视图函数里按照关键字接收

技术分享图片
def test20(request, name, id):        # name是第一个分组, id是第二个分组(这里的name,id反过来写也无所谓)
    return HttpResponse("name:{} id:{}".format(name, id))
views.py

视图函数中指定默认值

# urls.py中
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r‘^blog/$‘, views.page),                        # 当匹配到这个URL的时候,去做默认值的操作
    url(r‘^blog/page(?P<num>[0-9]+)/$‘, views.page),    # 当匹配到这个URL的时候,去做获取的到num相关的操作
]

# views.py中,可以为num指定默认值
def page(request, num="1"):
    pass

通过对应关系给视图函数传参

url(r‘^test40/([a-zA-Z]+)/(\d+)/$‘, views.test40, {"age": 998})

视图函数里按照关键字接收

技术分享图片
def test40(request, name, id, age):        # name id 是按照分组传进来的 age 是通过对应关系传进来的
    return HttpResponse("name:{} id:{} age:{}".format(name, id, age))
views.py

命名URL和URL反向解析

本质上就是给url匹配模式起【别名】,然后url跳转时(a标签/重定向)用过别名拿到具体的URL路径

1, 不带参数版本

url(r‘^home‘, views.home, name=‘home‘),          # 给我的url匹配模式起名为 home

在模板里引用

{% url ‘home‘ %}

在views视图里引用

from django.urls import reverse

reverse("index")

2, 带参数版本

url(r‘^index/(\d*)‘, views.index, name=‘index‘),          # 给我的url匹配模式起名为index

在模板里引用

{% url ‘index‘ ‘实参1‘ ‘实参2‘ %}

在views视图里引用

from django.urls import reverse

# 按位置传的参数
reverse("index", args=("实参1", "实参2", ...))

# 按关键字传的参数
reverse("index", kwargs={"形参1": "实参1", "形参2": "实参2", "形参3": "实参3"}, ...)

命令空间

即使不同的APP使用相同的URL【别名】,URL的命名空间模式也可以让你唯一反转命名的URL。

例子

project中的urls.py

from django.conf.urls import url, include
import app01
import app02

urlpatterns = [
    url(r‘^app01/‘, include(‘app01.urls‘, namespace=‘app01‘)),
    url(r‘^app02/‘, include(‘app02.urls‘, namespace=‘app02‘)),
]

app01中的urls.py

from django.conf.urls import url
from app01 import views
 
app_name = ‘app01‘
urlpatterns = [
    url(r‘^(?P<pk>\d+)/$‘, views.detail, name=‘detail‘)
]

app02中的urls.py

from django.conf.urls import url
from app02 import views
 
app_name = ‘app02‘
urlpatterns = [
    url(r‘^(?P<pk>\d+)/$‘, views.detail, name=‘detail‘)
]

现在,我的两个app中 url名称重复了,我反转URL的时候就可以通过命名空间的名称得到我当前的URL。

语法:  ‘命名空间名称:URL名称‘  

模板中使用

{% url ‘app01:detail‘ pk=12 pp=99 %}

views中的函数中使用

v = reverse(‘app01:detail‘, kwargs={‘pk‘:11})

Django进阶-路由系统

标签:数据   import   不同的   a标签   列表   views   正则表达式:   namespace   space   

原文地址:https://www.cnblogs.com/sunch/p/9735689.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!