Django url,從一個頁面調(diào)到另個頁面的方法
創(chuàng)建項目和應(yīng)用
django-admin startproject zqxt_views(項目名) cd zqxt_views python manage.py startapp calc(應(yīng)用名)
————–1.采用/add?a=4&b=5這樣GET方法進(jìn)行—————————
修改 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 文件,添加一個網(wǎng)址來對應(yīng)我們剛才新建的視圖函數(shù)。
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), ]
打開服務(wù)器并訪問
python manage.py runserver 8003
打開網(wǎng)址
http://127.0.0.1:8003/add/?a=4&b=5
————–2.采用/add/3/4這樣的網(wǎng)址的方式—————————
修改 calc/views.py 文件,再定義一個add2函數(shù)
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'),
我們可以看到網(wǎng)址中多了 (\d+), 正則表達(dá)式中 \d 代表一個數(shù)字,+ 代表一個或多個前面的字符,寫在一起 \d+ 就是一個或多個數(shù)字,用括號括起來的意思是保存為一個子組,每一個子組將作為一個參數(shù),被 views.py 中的對應(yīng)視圖函數(shù)接收。
我們再訪問 http://127.0.0.1:8003/add/4/5/ 就可以看到和剛才同樣的效果,但是這回網(wǎng)址更優(yōu)雅了
打開 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……中得到對應(yīng)的網(wǎng)址,相當(dāng)于給“網(wǎng)址取了一個名字”,只要名字不變,網(wǎng)址變了也能通過名字獲取到。
為了繼續(xù)弄清楚這個問題,我們先建立一個首頁的視圖和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文件中的靜態(tài)文件(js,css,圖片,資源)
我們在calc這個app中新建一個templates文件夾,在templates中新建一個home.html
文件 calc/templates/home.html 中寫入以下內(nèi)容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> <a href="/add/4/5" rel="external nofollow" >計算 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), ]
運行服務(wù)器python manage.py runserver 8004,訪問http://127.0.0.1:8004/
我們計算加法的時候用的是 /add/4/5/ ,后來需求發(fā)生變化,比如改成 /4_add_5/,但在網(wǎng)頁中,代碼中很多地方都寫死的 /add/4/5/,比如模板中可能是這么寫的
<a href="/add/4/5/" rel="external nofollow" rel="external nofollow" >計算 4+5</a>
如果這樣寫“死網(wǎng)址”,會使得在改了網(wǎng)址(正則)后,模板(template),視圖(views.py,比如用于URL跳轉(zhuǎn)),模型(models.py,獲取記錄訪問地址等)用了此網(wǎng)址的,都必須進(jìn)行相應(yīng)的更改,修改的代價很大,一不小心,有的地方?jīng)]改過來,就不能用了。
reverse 接收 url 中的 name 作為第一個參數(shù),我們在代碼中就可以通過 reverse() 來獲取對應(yīng)的網(wǎng)址
我們在終端上輸入: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 新的,更加規(guī)范了 >>> reverse('add2', args=(4,5)) u'/add/4/5/' >>> reverse('add2', args=(444,555)) u'/add/444/555/'
在網(wǎng)頁模板中也是一樣,可以很方便的使用。
不帶參數(shù)的: {% url 'name' %} 帶參數(shù)的:參數(shù)可以是變量名 {% url 'name' 參數(shù) %}
因此,我們將:templates/home.html 中
<a href="/add/4/5/" rel="external nofollow" rel="external nofollow" >link</a>改成 <a href="{% url 'add2' 4 5 %}" rel="external nofollow" >link</a>
這樣的話,當(dāng) urls.py 進(jìn)行更改,前提是不改 name(這個參數(shù)設(shè)定好后不要輕易改),獲取的網(wǎng)址也會動態(tài)地跟著變,比如改成:
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
{% url ‘a(chǎn)dd2' 4 5 %}就會被渲染成/new_add/4/5/
有另外一個情況,如果我們原來收藏的一個網(wǎng)址,現(xiàn)在這個網(wǎng)址被廢了,現(xiàn)在有個新的網(wǎng)址,如何讓以前的/add/3/4自動跳轉(zhuǎn)到新的網(wǎng)址那?
具體的思路是,在view.py寫一個跳轉(zhuǎn)方法:
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)) )
以上這篇Django url,從一個頁面調(diào)到另個頁面的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Django正則URL匹配實現(xiàn)流程解析
- Django路由層URLconf作用及原理解析
- django下創(chuàng)建多個app并設(shè)置urls方法
- 解決django的template中如果無法引用MEDIA_URL問題
- Django {{ MEDIA_URL }}無法顯示圖片的解決方式
- django ListView的使用 ListView中獲取url中的參數(shù)值方式
- Django模板標(biāo)簽中url使用詳解(url跳轉(zhuǎn)到指定頁面)
- django 通過url實現(xiàn)簡單的權(quán)限控制的例子
- Django項目主urls導(dǎo)入應(yīng)用中views的紅線問題解決
- Django URL參數(shù)Template反向解析
相關(guān)文章
將python2.7添加進(jìn)64位系統(tǒng)的注冊表方式
今天小編就為大家分享一篇將python2.7添加進(jìn)64位系統(tǒng)的注冊表方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Python的Bottle框架中返回靜態(tài)文件和JSON對象的方法
這篇文章主要介紹了Python的Bottle框架中返回靜態(tài)文件和JSON對象的方法,Bottle框架在Python開發(fā)者中具有很高的人氣,需要的朋友可以參考下2015-04-04Python中函數(shù)的創(chuàng)建與調(diào)用你了解嗎
這篇文章主要為大家詳細(xì)介紹了Python中函數(shù)的創(chuàng)建與調(diào)用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03Python中的命名元組簡單而強大的數(shù)據(jù)結(jié)構(gòu)示例詳解
namedtuple是Python中一個非常有用的數(shù)據(jù)結(jié)構(gòu),它提供了一種簡單的方式創(chuàng)建具有固定字段的輕量級對象,通過使用namedtuple,可以提高代碼的可讀性和可維護(hù)性,避免了使用類定義對象的復(fù)雜性,這篇文章主要介紹了Python中的命名元組簡單而強大的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2024-05-05