Django( 学习第三部 Django的url路由层)

目录

 url路由层

  路由匹配(有名分组与无名分组)

  反向解析

  路由分发

  名称空间(了解)

  Django版本区别

  

 注意事项

url(r "^index/ ", views.index),  路径前置导航斜杠(对应的是根路径的那个),不需要写,Django会自动加上.

http://17.0.0.1:8000/index  当我们访问Django的url路径时,如果请求路径最后没有写/, 那么Django会发出一个重定向的响应,告诉浏览器, 自动加上/ 来访问.

在settings.py配置文件中修改:  APPEND_SLASH =True ## 默认为True  Django会自己加 当为False 时  Django就不会自动加/ .

url 路由匹配

注意事项:

  •   url方法,第一个参数是正则表达式,只要第一个参数能够匹配到内容,就会立刻停止向下匹配,并且直接执行对应的视图函数
  •   输入url的时候会默认加斜杠,若没有加Django会做重定向,自动添加一个斜杠再次进行匹配.
  •   关闭Django自动添加斜杠进行匹配  APPEND_SLASE = Fales / True 默认为True 自动添加斜杠.
  •   有名分组和无名分组不可以混合使用,(有名 分组可以有多个,无名分组也可以有多个,切记俩者不可以混用)

无名分组

url(r'^text/(d+)/',views.test)

def tset(request,xx)
    print(xx)
    return HttpResponse('tset')

无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数

位置传参

有名分组

url(r'^add/(?P<a>d+)/',views.test)

def tset(request,a)
    print(a)
    return HttpResponse('tset')

有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数

关键字传参

反向解析:

  通过一些方法得到一个结果,该结果可以直接访问对应的url触发视图函数

#先给路由与视图函数起一个别名
url(r'*func_kk/',views.func,name='ooo')

    前端解析
    < a  href = "{% ooo %}">111</a>
    
    后端解析
    form django.shortcuts import render,HttpResponse,redirect,reverse
    reverse("ooo")

 无名分组的反向解析

# 无名分组对的反向解析

url (r'^index/(d+)/',views.inde,name='ooo')

前端解析
    {% url  "ooo" 123 %}

后端解析
    reverse( 'ooo' ,args=(1,) )


这个数字在写代码的时候应该放什么
    数字一般情况下放的是数据的主键值  数据的编辑和删除
    
    url(r'^edit/(d+)/',views.edit,name="ooo")

    def edit(request,edit_id):
        reverse('ooo' ,args=(edit_id,))

    {% for user_obj in user_queryset %}
    <a href= {% url 'ooo'  user_obj.id %} >编辑</a>
    {% endfor%}

 有名分组的反向解析

# 有名分组的反向解析
url(r'^index/(?P<year>d+)/',views.index,name='ooo')

前端解析
     <a href ='{% url 'ooo' year=123 %}'>111</a> #(了解)
     < a href = '{% url "ooo" 123%}'>123</a>    #记忆

后端解析
    print(reverse("ooo" , kwargs={'yesr':123}))     #(了解)
    print( reverse('ooo',args=(111,))) 

路由分发

Django1.1版本的路由分发

主路由#主路由


from django.conf.urls import url,include

from app01 import urls as app01_urls
from app02 import urls as app02_urls
          或者
          如下 from django.contrib import admin urlpatterns
= [ url(r'admin/',admin.site.urls), #方式1 url(r'app01/',include(app01-urls)), url(r'app02/',include(app02-urls)), #方式2(推荐使用) url(r'app01/',include('app01.urls')), url(r'app02/',include('app02.urls')), ]

子路由

#子路由
from django.conf.urls import url
from app01 import views

urlpatterns = [
    url(r'add/',views.add),
]

Django2.2版本的路由分发

(对多个APP中的重名视图函数根据不同的APP进行分发,互不干扰)

主路由

from django.contrib import admin
from django.urls import path,include



urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include("app01.urls")),
    path('app02/', include('app02.urls'))
]

#主路由的的re_path中不可以加$符

子路由

from django.urls import path

from app01 import views

urlpatterns = [
    path('func/', views.func)
]

名称空间(了解)

(多个应用出现相同的别名时,研究反向解析会不会自动识别应用前缀)

正常情况下的反向解析是没有办法自动识别前缀

主路由

#主路由
from django.conf.urls import url,include

urlpatterns = [
    url(r'admin/',admin.site.urls),

    url(r'app01/',include('app01.urls',namespace='app01')),
    url(r'app02/',include('app02.urls',namespace='app02')),
]

子路由

#子路由
from django.conf.urls import url
from app01 import views
#app01
urlpatterns = [
    url(r'add/',views.add,name='add'),
]
#app02
urlpatterns = [
    url(r'add/',views.add,name='add'),
]

视图函数中的反向解析

reverse('app01:add')

reverse('app01:add')

前端中的反向解析

{% url "app01:add" %}

{% url "app02:add" %}

django之间的版本区别

1.x与2.x

区别一

django 1.x中路由层使用的是url方法
    url()中的第一个参数支持正则
from django.conf.urls import url

urlpatterns = [
    url(r'admin/', admin.site.urls),
    url(r'^add/',viwes.add)
]




django 2.x和3.x 中使用的是path方法
    path()中的第一个参数不支持正则,写什么匹配什么
from django,urls import path,re_path  #导入模块,支持正则


urlpatterns = [
    path('admin/',admin.site.urls),
    path('add/',viwes.add)
  re_path(r'^add/',views.add)   #支持正则 ]

区别二

path 内部默认支持五种转换器  (支持自定义转换器)

str  int  slug  uuid  path

path('index/<int:id>/',index)


视图函数

def index(request,id):
    print(id,type(id))
    return HttpResponse('index')
View Code
好好学习,天天向上。
原文地址:https://www.cnblogs.com/f211/p/13763225.html