1. 程式人生 > >Django url,從一個頁面調到另個頁面,

Django url,從一個頁面調到另個頁面,

建立專案和應用

django-admin startproject zqxt_views(專案名)
cd zqxt_views
python manage.py startapp calc(應用名)

————–1.採用/add?a=4&b=5這樣GET方法進行—————————
修改 calc/view.py檔案

from django.shortcuts import render
from django.http import HttpResponse

def add(request):
    a = request.GET['a']
    b = request.GET['b'
] c = int(a)+int(b) return HttpResponse(str(c))

修改 zqxt_views/urls.py 檔案,新增一個網址來對應我們剛才新建的檢視函式。

from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views

urlpatterns = [
    url(r'^add/$', calc_views.add, name='add'),  # 注意修改了這一行
    url(r'^admin/'
, admin.site.urls), ]

開啟伺服器並訪問

python manage.py runserver 8003

開啟網址

http://127.0.0.1:8003/add/?a=4&b=5

————–2.採用/add/3/4這樣的網址的方式—————————
修改 calc/views.py 檔案,再定義一個add2函式

def add2(request, a, b):
    c = int(a) + int(b)
    return HttpResponse(str(c))

接著修改 zqxt_views/urls.py 檔案,再新增一個新的 url

 url(r'^add/(\d+)/(\d+)/$'
,calc_views.add2,name='add2'),

我們可以看到網址中多了 (\d+), 正則表示式中 \d 代表一個數字,+ 代表一個或多個前面的字元,寫在一起 \d+ 就是一個或多個數字,用括號括起來的意思是儲存為一個子組,每一個子組將作為一個引數,被 views.py 中的對應檢視函式接收。

我們再訪問 http://127.0.0.1:8003/add/4/5/ 就可以看到和剛才同樣的效果,但是這回網址更優雅了

開啟 zqxt_views/urls.py

from django.conf.urls import url
from django.contrib import admin
from calc import views as calc_views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^add/$',calc_views.add,name='add'),
    url(r'^add/(\d+)/(\d+)/$',calc_views.add2,name='add2'),
]

url(r'^add/$',calc_views.add,name='add'),中,name=’add’是用來幹什麼滴啊?
簡單說,name可用於在templates,models,views……中得到對應的網址,相當於給“網址取了一個名字”,只要名字不變,網址變了也能通過名字獲取到。

為了繼續弄清楚這個問題,我們先建立一個首頁的檢視和url
修改 *calc/views.py*

from django.http import HttpResponse
from django.shortcuts import render


def index(request):
    return render(request, 'home.html')

render 是渲染模板

將‘calc’這個app加入到*zqxt_views/settings.py 中*

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'calc',
]

這樣,使用render的時候,Django會自動找到INSTALLED_APPS中列出的各個app下的templates中的檔案。
提示:DEBUG=True的時候,Django可以自動找到各個app下static檔案中的靜態檔案(js,css,圖片,資源)

我們在calc這個app中新建一個templates資料夾,在templates中新建一個home.html
檔案 calc/templates/home.html 中寫入以下內容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>title</title>
</head>
<body>
    <a href="/add/4/5">計算 4 + 5 </a>
</body>
</html>

修改zqxt_views/urls.py

urlpatterns = [
    url(r'^$', calc_views.index, name='home'),
    url(r'^add/$', calc_views.add, name='add'),
    url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
    url(r'^admin/', admin.site.urls),
]

執行伺服器python manage.py runserver 8004,訪問http://127.0.0.1:8004/
我們計算加法的時候用的是 /add/4/5/ ,後來需求發生變化,比如改成 /4_add_5/,但在網頁中,程式碼中很多地方都寫死的 /add/4/5/,比如模板中可能是這麼寫的

<a href="/add/4/5/">計算 4+5</a>

如果這樣寫“死網址”,會使得在改了網址(正則)後,模板(template),檢視(views.py,比如用於URL跳轉),模型(models.py,獲取記錄訪問地址等)用了此網址的,都必須進行相應的更改,修改的代價很大,一不小心,有的地方沒改過來,就不能用了。

reverse 接收 url 中的 name 作為第一個引數,我們在程式碼中就可以通過 reverse() 來獲取對應的網址
我們在終端上輸入:python manage.py shell

>>> from django.core.urlresolvers import reverse  # django 1.4.x - django 1.10.x
或者
>>> from django.urls import reverse  # Django 1.10.x - Django 2.x 新的,更加規範了

>>> reverse('add2', args=(4,5))
u'/add/4/5/'
>>> reverse('add2', args=(444,555))
u'/add/444/555/'

在網頁模板中也是一樣,可以很方便的使用。

不帶引數的:
{% url 'name' %}
帶引數的:引數可以是變數名
{% url 'name' 引數 %}

因此,我們將:templates/home.html

<a href="/add/4/5/">link</a>改成
<a href="{% url 'add2' 4 5 %}">link</a>

這樣的話,當 urls.py 進行更改,前提是不改 name(這個引數設定好後不要輕易改),獲取的網址也會動態地跟著變,比如改成:

url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),

{% url ‘add2’ 4 5 %}就會被渲染成/new_add/4/5/

有另外一個情況,如果我們原來收藏的一個網址,現在這個網址被廢了,現在有個新的網址,如何讓以前的/add/3/4自動跳轉到新的網址那?

具體的思路是,在view.py寫一個跳轉方法:

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

def old_add2_redirect(request, a, b):
    return HttpResponseRedirect(
        reverse('add2', args=(a, b))
    )