Django中url()


使用django的時候,如果我們希望我們編寫的view可以被正常訪問,就需要配置url。

在django的官方文檔中,url()的例子如下:

 

polls/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

mysite/urls.py

from django.conf.urls import include, url
from django.contrib import admin

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

 

首先給我們展示了,如何將 app 中的 url.py 加入到 project的 url.py中

如上所示,通過使用導入的 include 就可以幫我們做到, 

 

現在我們重點說一下 url() :

url() 函數具有四個參數: regex(必需)、view(必需)、kwargs(可選)、name(可選)

url(regex, view, kwargs=None, name=None)

url()參數:regex

  這里其實是一個正則表達式,對應了URL模式。Django 從第一個正則表達式開始,依次將請求的URL 與 每個正則表達式進行匹配,知道找到匹配的那個位置。需要注意的是,這里的正則表達式不會匹配URL中 POST/GET 的參數和域名。例如:在http://www.epython.cn/myapp/ 請求中,URLconf 查找的是 myapp/ ;在http://www.epython.cn/myapp/?page=3 請求中,URLconf 查找的也是 myapp/ 。

 

url()參數:view

  當django 找到一個匹配的正則表達式時,就會調用 view參數 指定的 視圖函數,並將HttpRequest對象作為第一個參數,從正則表達式中 ”捕獲“ 的其他值作為其他參數,傳入到該試圖函數中。如果正則表達式使用簡單的捕獲方式,值將作為位置參數傳遞;如果使用命名的捕獲方式,值將作為關鍵字參數傳遞。

from django.conf.urls import url
from account import views

urlpatterns = [
    url(r'^login/', views.login),   # 第一個參數是regex , 第二個參數是view
    url(r'^logout/', views.logout),
]

 

url()參數:kwargs

url(r'^login/', views.login, {'summary': True})

對應的視圖函數

def login(request, summary):
    print(summary)
    return HttpResponse("Login Func.")

 

url()參數:name

  name用來命名你的URL,這樣你就可以在django的其他地方,尤其是模板中,通過名稱來明確的引用這個URL,這個強大的特性可以讓你,僅僅修改一個文件就可以改變全局的URL模式。

url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),

  name 可以簡單的理解為給前面的regex參數起了一個別名,在regex 改變后,我們不用修改 Template 、views 或 model中的代碼。

  來看一個簡單的例子:

#  url.py
url(r'^plus/(\d+)/(\d+)/$', views.plus, name='plus'),

#  index.html
<a href="/plus/12/24/">計算 12+24</a>

現在如果我們需要計算的話只需要訪問 /plus/12/24/ 就可以了。

有一天我們需要改變一下url 將  /plus/12/24/ 修改成  /12_plus_24/, 這樣就會導致我們修改改了url.py之后,對應的Template、views 或 model中對應的地址也需要修改,需要修改的地方越多,我們付出的代價也就越大。

而使用通過 name 參數,我們就可以解決這個問題。

url.py
url(r'^/(\d+)_plus_(\d+)/$', views.plus, name='plus'),

index.html
<a href="{% url 'plus' 12 24 %}">計算 12+24</a>

 

注意: 從第一種方式 變成第二種方式,name 不能修改。

 

URL中的namespace

在真實的django項目中, 可能會有多個app(五個、十個、或者更多);這個時候需要區分URL中的app的名字。例如,polls 應用具有一個detail 視圖,相同項目中的博客應用可能也有這樣一個視圖。當使用模板標簽{% url %}時,人們該如何做才能使得Django知道為一個URL創建哪個應用的視圖?

這個時候就需要用到URLconf中的 namespace 。

#  mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^polls/', include('polls.urls', namespace="polls")),
    url(r'^admin/', include(admin.site.urls)),
]

最初的index.html

#  polls/templates/polls/index.html
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

修改后的index.html

#  polls/templates/polls/index.html
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM