一、Django url
url對應(yīng)關(guān)系其實(shí)總結(jié)可以分為兩種
1、一個url對應(yīng)一個函數(shù)/一個類
#一個函數(shù)對應(yīng)
url(r'^index/', views.index)
#一個類對應(yīng)
url(r'^index/', views.Index.as_view())
2、一組url對應(yīng)一個函數(shù)/一個類
#方法一
<a href='index?nid={{ }}'>
#方法二
url(r'^index-(\d+)', views.index)
(一)、方法一的講解
我們看一下效果點(diǎn)擊前

點(diǎn)擊后:

有時候我們會見到這種連接3w.xxx?page=1,在Django中實(shí)現(xiàn)方法如下
view層的代碼
USER_DICT={
'1':{'name':"w"},
'2': {'name': "c"},
'3': {'name': "y"},
}
def test(request):
if request.method == 'GET':
num = request.GET.get('nid',None)
print(num)
if num:
USER_DIC = USER_DICT.get(num,None)
if USER_DIC:
return render(request,'nid.html',{'user_dict':USER_DIC})
return render(request,'test.html',{'user_dict':USER_DICT})
templates 頁面
<ul>
{% for i,k in user_dict.items %}
<li><a href="/test?nid={{ i }}">{{ k.name }}</a> </li>
{% endfor %}
</ul>
ulrs 鏈接寫法
url(r'^test', views.test),
這個,我們要注意的就是在a標(biāo)簽連接拼接,用?加鍵值對就是簡單的get請求
<a href="/test?nid={{ i }}">
(二)、方法二
第一種一個正則
點(diǎn)擊前:

點(diǎn)擊后:

這次連接在不向之前那樣,通過鍵值對的形式獲取
處理的方法我們在view 層給我們的函數(shù)加了一個參數(shù),用來接收連接里面返回的值,可以在方法設(shè)置多個值接受url正則匹配值
#用來展示點(diǎn)擊前的頁面
def test(request):
return render(request, 'test.html',{'user_dict':USER_DICT})
#用來展示點(diǎn)擊后的頁面,方法中的nid 可以隨意取名
def nid(request,nid):
USER_DIC= USER_DICT[nid]
return render(request,'nid.html',{'user_dict':USER_DIC})
在urls 里面
url(r'^test', views.test),
url(r'^nid-(\d+)', views.nid),
我們看到了(r'^nid-(\d+)'這種的url映射的寫法,所以在a標(biāo)簽的時候我們也給寫對應(yīng)形式
<a href="nid-{{ i }}">
第二種多個正則
寫法一:
url(r'^nid-(\d+)-(\d+)', views.nid),
這種url對應(yīng)view 層 有兩種寫法
#uid,nid 分別是和正則對應(yīng)url是一一對應(yīng)
def test(request,uid,nid):
#第二種可以利用*arg
def test(request,*arg):
寫法二:
url(r'^nid-(?P<nid>\d+)-(?P<uid>\d+)', views.nid),
#uid,nid 分別是和正則對應(yīng)url是一一對應(yīng)
def test(request,uid,nid):
#第二種可以利用**kwargs
def test(request,**kwargs):
二、url分發(fā)
(1)、include
可以在app 中設(shè)置一個自己的urls,然后利用include進(jìn)行分發(fā),就好比Django中的urls是總站進(jìn)行分發(fā)給個個apps中打的urls


(2)、字典
在url參數(shù)中增加字典,讓views層接受
url.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#在url傳遞字典
url(r'index/',views.index,{'name':'test'}),
]
views.py接收
from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.
#通過接收字典k返回v
def index(reques,name):
print(name)
return HttpResponse('ok')
(3)、url命名
當(dāng)兩個不同的url,用同一個url分發(fā),views層如何區(qū)別是哪個url,傳遞過來,如下圖,最簡單的方法我們可以用定位,也就是當(dāng)前url x和接受的url形成關(guān)系設(shè)置成唯一
#這里的前綴a和b 都指向了同一個 app文件
url(r'a/',include('app01.urls',namespace='a')),
url(r'b/',include('app01.urls',namespace='b'))

urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#用 namespace 設(shè)置識別屬性標(biāo)記
url(r'a/',include('app01.urls',namespace='a')),
url(r'b/',include('app01.urls',namespace='b'))
]
app-urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
#指定url 名字
app_name = 'app01'
urlpatterns = [
url(r'index/',views.index,name="app"),
]
views.py
from django.shortcuts import render,HttpResponse
from django.urls import reverse
# Create your views here.
def index(request):
#用來接受,判斷觸發(fā)的函數(shù)
v = reverse('a:app')
print(v)
return HttpResponse('ok')