Django中URL的參數(shù)傳遞的實現(xiàn)
在Django中有非常強大的URL模塊,可以按照開發(fā)者的想法來制定清晰的URL,同時支持正則表達式。此外,在URL中還可以傳遞參數(shù)。
1. Django處理請求的方式
1) Django通過URLconf模塊來進行判斷。通常情況下,這就是ROOT_URLCONF配置的價值,但是如果請求攜帶了一個urlconf的屬性(通常被中間件設(shè)置),那么這個被攜帶的urlconf將會替代ROOT_URLCONF的配置。
2) Django會調(diào)用Python模塊并尋找各種urlpatterns。這是一個屬于django.conf.urls.url()實例的python列表。
3) Django會遍歷每個URL pattern,自上而下,并且選取收割匹配請求URL的pattern。
4) 一旦匹配某個url pattern的正則表達式,Django將導(dǎo)入并調(diào)用相關(guān)的view(這是一個簡單的python函數(shù),或者是一個class-based view)
這個view將會傳遞下列參數(shù):
- 一個HttpRequest的實例
- 如果匹配了URL中一個no named group,那么參數(shù)將會按根據(jù)URL中的位置一一對應(yīng)
- 如果匹配了URL中一個named group,且參數(shù)傳遞是通過named group來匹配的,那么參數(shù)將會被指定的kwargs代替。
5) 如果沒有任何一個正則表達式被匹配,那么Django會拋出異常,并報錯。
2.URL中的named group
URL可以通過named group方式傳遞指定參數(shù),語法為: (?P<name>pattern), name 可以理解為所要傳遞的參數(shù)的名稱,pattern代表所要匹配的模式。例如,
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
那么year,month將會對應(yīng)views傳遞過來的year,month的值,而后面緊跟的則代表正則表達匹配的模式。
3. URL的反向解析
通常來說在處理完一個表單之后,網(wǎng)頁會發(fā)生跳轉(zhuǎn)。通常寫URL我們都避免硬編碼,這樣不方便后期的調(diào)整。通常我們需要從URL獲取兩種內(nèi)容,最主要是view能夠通過URL獲取一些標識并處理,另一些信息則是傳遞過來的參數(shù)。
Django提供了一種解決方案,URL mapper是與URL設(shè)計一一對應(yīng)。你可以通過URLconf來實現(xiàn),并反向使用它。例如,
- 由用戶通過瀏覽器發(fā)起URL請求,調(diào)用view,并將URL中的參數(shù)傳遞給view
- 通過view并附上相應(yīng)參數(shù),找到相應(yīng)匹配的URL。
后者我們稱之為對URLs的反向解析。反向解析的例子,
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
Django在不同的層次也提供了一些工具來實現(xiàn)URL的反向解析。
- 在template中:使用url標簽
- 在python中:使用django.core.urlresolvers.reverse()函數(shù)
- 在更高層次處理model實例時,可以使用get_absolute_url()方法
4. 利用URL來完成Device,Line表的增加功能
對于信息系統(tǒng),我們可以把Node,Device, Line都看成是一種資源,對其中任何一種要素的修改,都是對資源的修改,只是會落實到不同的表中,但是在程序中可以一樣看到?,F(xiàn)在,我們就基于上一節(jié)的代碼做些修改。
1)修改URL的配置,將原來的add對應(yīng)的url進行擴充
urls.py:
from django.conf.urls import url from django.contrib import admin import echo.views urlpatterns = [ url(r'^admin/', admin.site.urls), #內(nèi)容顯示,并通過定義name,來進行反向解析 url(r'^lists/(?P<table>\w+)/$', echo.views.lists, name='lists'), #增加內(nèi)容 url(r'^add/(?P<table>\w+)/$', echo.views.add, name='add'), ]
2) 修改views的函數(shù)的參數(shù),在request后加入table,使該函數(shù)能夠用于所有表格。request是views函數(shù)中必須要有的參數(shù)。
views.py:
# -*- coding: UTF-8 -*- from .models import Node,Line,Device from forms import NodeForm,LineForm,DeviceForm from django.shortcuts import render, redirect # Create your views here. def lists(request, table): #從根據(jù)不同的請求,來獲取相應(yīng)的數(shù)據(jù),并跳轉(zhuǎn)至相應(yīng)頁面 if table == 'node': data = Node.objects.all() list_template = 'node_list.html' if table == 'line': data = Line.objects.all() list_template = 'line_list.html' if table == 'device': data = Device.objects.all() list_template = 'device_list.html' #建立context字典,將值傳遞到相應(yīng)頁面 context = { 'data': data, } #跳轉(zhuǎn)到相應(yīng)頁面,并將值傳遞過去 return render(request,list_template,context) def add(request, table): #根據(jù)提交的請求不同,獲取來自不同F(xiàn)orm的表單數(shù)據(jù) if table == 'node': form = NodeForm(request.POST or None) if table == 'line': form = LineForm(request.POST or None) if table == 'device': form = DeviceForm(request.POST or None) #判斷form是否有效 if form.is_valid(): #創(chuàng)建實例,需要做些數(shù)據(jù)處理,暫不做保存 instance = form.save(commit=False) #將登錄用戶作為登記人 if table == 'node': instance.node_signer = request.user if table == 'line': instance.line_signer = request.user if table == 'device': instance.device_signer = request.user #保存該實例 instance.save() #跳轉(zhuǎn)至列表頁面,配合table參數(shù),進行URL的反向解析 return redirect('lists', table=table) #創(chuàng)建context來集中處理需要傳遞到頁面的數(shù)據(jù) context = { 'form': form, } #如果沒有有效提交,則仍留在原來頁面 return render(request, 'add.html', context)
3)在template中建立相關(guān)頁面:
add.html:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <form method='POST' action=''>{% csrf_token %} {{ form }} <input type='submit' value='提交' /> </form> </body> </html>
device_list.html:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <table> <tr> <th>設(shè)備名稱</th> <th>設(shè)備型號</th> </tr> {% for item in data %} <tr> <td>{{ item.device_caption }}</td> <td>{{ item.device_type }}</td> </tr> {% endfor %} </table> </body> </html>
line_list.html:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <table> <tr> <th>線路名稱</th> <th>線路速率</th> <th>線路類型</th> </tr> {% for item in data %} <tr> <td>{{ item.line_code }}</td> <td>{{ item.line_speed }}</td> <td>{{ item.line_type }}</td> </tr> {% endfor %} </table> </body> </html>
node_list.html:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <table> <tr> <th>節(jié)點名稱</th> <th>節(jié)點地址</th> <th>節(jié)點類型</th> </tr> {% for item in data %} <tr> <td>{{ item.node_name }}</td> <td>{{ item.node_address }}</td> <td>{{ item.node_type }}</td> </tr> {% endfor %} </table> </body> </html>
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python編程新標準學(xué)會十項好習(xí)慣提升編碼質(zhì)量
這篇文章主要為大家介紹了Python編程新標準學(xué)會十項好習(xí)慣提升編碼質(zhì)量,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01Python實現(xiàn)九宮格式的朋友圈功能內(nèi)附“馬云”朋友圈
PIL(Python Imaging Library)是一個非常強大的Python庫,但是它支持Python2.X, 在Python3中則使用的是Pillow庫,它是從PIL中fork出來的一個分支。這篇文章主要介紹了用Python搞定九宮格式的朋友圈功能內(nèi)附“馬云”朋友圈 ,需要的朋友可以參考下2019-05-05spark: RDD與DataFrame之間的相互轉(zhuǎn)換方法
今天小編就為大家分享一篇spark: RDD與DataFrame之間的相互轉(zhuǎn)換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06