Python Django進階教程(一)(高階檢視和URL配置)

HuangZhang_123發表於2017-05-03

Django版本:1.11
作業系統:Windows
Python:3.5
歡迎加入學習交流QQ群:657341423


高階檢視和URL配置
首先回顧一下url和views的基礎寫法。
url.py

url(r'^search/$', views.Search),

views.py

def Search(request):
    if request.method == 'POST':
        if 'q' in request.POST:
            message = 'POST You searched for: %r' % request.POST['q']
        else:
            message = 'POST You submitted an empty form.'
        return HttpResponse(message)
    else:
        if 'g' in request.GET and request.GET['g']:
            q = request.GET['g']
            name = Publisher.objects.filter(country=q)
            return render_to_response('results.html',
                                      {'name': name, 'query': q})
        else:
            return render_to_response('Search.html', {'error': True})

這種寫法是最基礎的。但是對於web開發而言,面對複雜的系統設計,這基礎的寫法就有點有心無力了。例如,如果不同的url上,所指向的views的功能是一樣的情況下,那麼我們就只能寫2個views的方法,而且裡面的程式碼是很多重複性的。這樣就造成程式碼的冗餘了。
以下介紹urls帶引數使用:
1.地址上帶引數:
urls.py

url(r'^time/(?P<day>\d+)/$', views.current_datetime),

可以看到(?P<day>\d+) 為一個引數。一個為urls的引數。如果多個引數,可以是這樣r'^time/(?P<day>\d+)/(?P<mouth>\d+)/$'
views.py

def current_datetime(request,day,mouth):

只要在定義方法的時候,引數寫上urls上的對應引數即可。
注意:引數的數目一定要對應,儘管你可能在def裡面用不到這個引數,但命名的時候一定寫上,不然會報錯。


2.urls的額外引數
urls.py

url(r'^time/(?P<day>\d+)/$', views.current_datetime,{'mouth':'03'}),

可以看到,對比1來說,我們在後面加了{'mouth':'03'} 這也是對這個url提供引數,在views.py的用法和上述的用法一樣。
對比1而言,2這種用法就比較常用。而1的用法就比較小用到。
對於2這用法,除了引數之外,還能將模版,模型作為引數傳遞。

url(r'^now/$',views.now,{'temp':'aa.html','model':models.Publisher}),
url(r'^nowtime/$',views.now,{'temp':'current_datetime.html','model':models.Bolg}),

同樣地在views.py的用法也是一樣

def now(request,temp,model):
    return render_to_response(temp,{'current_date': "aaa"})

urls帶引數使用大致上就是這兩種用法,在這兩種用法上,可以延伸到很多設計方法。比如:
這裡寫圖片描述
這裡的url和我上述說的不一樣,因為這個url的引數沒有命名引數名稱,所以在def是按照順序生成即可。個人不建議這種使用方式。


以下介紹檢視函式的高階使用
首先是views.py裡面的函式帶額外的引數。上面已講述過。如

def now(request,temp,model):

在檢視中,對於html的post和get處理,普通寫法都是在一個方法函式裡實現:如下:
這裡寫圖片描述
這種寫法就是將post和get的全部邏輯都在一個函式實現
如果將其分離,如:
這裡寫圖片描述
其中return GET(request)return POST(request) 裡面的post和get代指的是對應的some_page_getsome_page_post
主要通過method_splitter 判斷post和get,然後返回對應的處理方法。簡單來說就是方法函式裡面呼叫其他方法函式。
常用情景:大部分網站都是有登記檢測,比如我們常見的個人資訊管理,購物車結算等等都要使用者登入才能進行操作的。如果在使用者沒有登入的情況下會自動檢測是否登入,然後跳到登入介面,完成登入才能操作下一步操作。
舉個例子:
這裡寫圖片描述
這裡寫圖片描述


總結:url和檢視大致上就這幾種常用方法。簡單來說,url實現引數傳遞,檢視實現函式之間的呼叫。


進階教程程式碼:請點選

相關文章