Django进阶-路由系统

Posted sunch

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django进阶-路由系统相关的知识,希望对你有一定的参考价值。

概述

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进阶-路由系统的主要内容,如果未能解决你的问题,请参考以下文章

Django进阶(路由系统中间件缓存Cookie和Session

django进阶

9月3日 文成小盆友python-num18 - django进阶一

django框架--路由系统

python--第十八天总结(Django进阶)

30Python之web框架django进阶篇