您好,登錄后才能下訂單哦!
前面學習的例子都是通過 url 來匹配 一個函數,這種方式叫做 function based view (BSV)。一個典型的使用方式就是通過在view.py里面定義一個函數,然后通過函數的request參數獲取method的類型,比如直接刷新頁面就是get方式,提交表單就是post方式,這樣來根據提交的不同方式進行不同的處理。
比如:
def user_info(request): if request.method == "GET": user_list = models.UserInfo.objects.all() group_list = models.UserGroup.objects.all() return render(request, 'user_info.html', {'user_list': user_list, "group_list": group_list}) elif request.method == 'POST': u = request.POST.get('user') p = request.POST.get('pwd') models.UserInfo.objects.create(username=u,password=p) return redirect('/cmdb/user_info/')
另外一種方式叫做 class based view (CBV)。這種方式需要導入一個View類,通過自定義一個子類繼承這個類,我們可以利用View里面的dispatch()方法來判斷請求是get還是post。dispatch方法的本質是一個反射器,可以根據名字來調用同名的方法。
View類的部分代碼可以看出dispatch通過反射獲取列表里面的方法名稱
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] def dispatch(self, request, *args, **kwargs): # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs)
CBV的例子如下。
注意這里在子類里面重新定義了dispatch這個方法,同時又使用了super()來調用父類的構造方法,這樣的好處是功能不變,但是可以靈活的添加新的功能。
from django.views import View class Home(View): def dispatch(self, request, *args, **kwargs): # 調用父類中的dispatch print('before') result = super(Home,self).dispatch(request, *args, **kwargs) print('after') return result def get(self,request): print(request.method) return render(request, 'home.html') def post(self,request): print(request.method,'POST') return render(request, 'home.html')
為了調用自定義的類里面的方法,在url里面,我們需要調用View類的as_view()方法作為入口。
比如說
# urls.py from django.conf.urls import url from myapp.views import MyView urlpatterns = [ url(r'^about/', MyView.as_view()), ]
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。