python_Django 的url(一)

一、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)擊前


image.png

點(diǎn)擊后:


image.png

有時候我們會見到這種連接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)擊前:


image.png

點(diǎn)擊后:


image.png

這次連接在不向之前那樣,通過鍵值對的形式獲取
處理的方法我們在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


image.png
image.png

(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'))
image.png

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')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容