類視圖 使用原則 代碼越少越好 永遠不要重覆代碼 View應當只包含呈現邏輯, 不應包括業務邏輯 保持view邏輯清晰簡單 不要將CBVs用作403, 404, 500的錯誤處理程式 保持mixin簡單明瞭 mixin 在編程中mixin是指為繼承它的class提供額外的功能, 但它自身卻不能單獨使 ...
類視圖
使用原則- 代碼越少越好
- 永遠不要重覆代碼
- View應當只包含呈現邏輯, 不應包括業務邏輯
- 保持view邏輯清晰簡單
- 不要將CBVs用作403, 404, 500的錯誤處理程式
- 保持mixin簡單明瞭
- Django自身提供的View永遠在最右邊
- mixin依次在以上view的左邊
- mixin永遠繼承自Python的object類型
View 基本View 可以在任何時候使用 見後面詳細介紹 RedirectView 重新定向到其他URL 將訪問"/log-in/"的用戶重新定向到"/login/" TemplateView 顯示Django 模板 一般網站中使用模板顯示的頁 ListView 顯示對象列表 文章列表頁 DetailView 顯示對象詳情 文章詳細頁 FormView 提交From 網站聯繫我們或emai訂閱form CreateView 創建對象 創建新文章頁 UpdateView 更新對象 修改文章頁 DeleteView 刪除對象 刪除文章頁 Generic date views 顯示一段時間內的對象 按時間歸類的博客
View
django.views.generic.base.View 基於類的基礎視圖的核心。其它所有的基於類的視圖都繼承自這個基礎類。from django.shortcuts import render,HttpResponse from django.views.generic import View class Index(View): """ class django.views.generic.base.View 基於類的基礎視圖的核心。其它所有的基於類的視圖都繼承自這個基礎類 URL配置: url(r'^index/(\d+)', Index.as_view(state=0)), """ # as_view參數 state = None # 該視圖接收的HTTP方法 http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace',]
def dispatch(self, request, *args, **kwargs): print("請求之前執行") obj = super(Index,self).dispatch(request, *args, **kwargs) print("請求之後執行") return obj
def get(self, request,id): print(self.state) print(id) return HttpResponse("GET")
def post(self, request): return HttpResponse("POST")
TemplateView
從以下視圖繼承方法和屬性django.views.generic.base.TemplateResponseMixin
django.views.generic.base.ContextMixin
django.views.generic.base.View
from django.views.generic.base import TemplateView class HomePageView(TemplateView): """ django.views.generic.base.TemplateView 渲染一個給定的模板,包含上下文和從URL捕獲的參數。 URL配置: url(r'^home/', HomePageView.as_view(template_name='about.html')), 此處的 `template_name` 可以覆蓋視圖中的 `template_name`的值 """
template_name = "home.html"
def dispatch(self, request, *args, **kwargs): print("模板渲染前") obj = super(HomePageView,self).dispatch(request, *args, **kwargs) print("模板渲染後") return obj
# 用於添加額外的上下文對象 def get_context_data(self, **kwargs): context = super(HomePageView, self).get_context_data(**kwargs) context['latest_articles'] = ['金融','IT','雜談'] # context['user_list'] = models.UserInfo.objects.all() print("渲染模板") return context
RedirectView
從以下視圖繼承方法和屬性:django.views.generic.base.View
from django.views.generic.base import RedirectView class ArticleRedirectView(RedirectView): """ django.views.generic.base.RedirectView 重定向到一個給定的URL。 URL配置: url(r'^aaa/', views.ArticleRedirectView.as_view(url='/ccc')), url(r'^bbb/', views.bbb,name='article-detail'), url(r'^ccc/', views.ccc,name='ccc'), """ url = None permanent = False # True: 重定向狀態碼301; False: 重定向狀態碼302 query_string = True # 是否將GET 的查詢字元串一起傳遞給新的地址. # True: /aaa?id=1 ---> /ccc?id=1 # False: /aaa?id=1 ---> /ccc/ pattern_name = 'article-detail' # 如果沒有定義 `url參數`,使用改參數重定向
def dispatch(self, request, *args, **kwargs): print("重定向前") obj = super(ArticleRedirectView,self).dispatch(request, *args, **kwargs) print("重定向後") return obj
# 構造重定向的目標URL def get_redirect_url(self, *args, **kwargs): print("重定向") return super(ArticleRedirectView, self).get_redirect_url(*args, **kwargs)
DetaliView
DetailView是對這些出版商的諸多的object中的一個進行詳細解析,它獲得的主數據是一個object。
django.views.generic.detail.SingleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.detail.BaseDetailView
django.views.generic.detail.SingleObjectMixin
django.views.generic.base.View
from django.contrib.auth.mixins import LoginRequiredMixin from chouti.models import UserInfo class UserDetailView(DetailView): """ django.views.generic.detail.DetailView 執行這個視圖的時候,self.object 包含視圖正在操作的對象(models) URL配置: url(r'^(?P<user_id>\d+)$',views.UserDetailView.as_view()), """ model = UserInfo template_name = 'user.html' # 模板 pk_url_kwarg = 'user_id' # PublisherDetail.objects.filter(pk=user_id)
def get_context_data(self, **kwargs): print("get_context_data") print(self.object.username) # 獲取上下文對象, context = super(UserDetailView, self).get_context_data(**kwargs) context['now'] = [33, 44] # 添加額外的上文對象 return context
ListView
對於ListView來說,它需要顯示的是多個object的信息,返回的是一個對象列表 它的數據來源是model和queryset這兩個屬性:model:獲取這個model相關的所有數據
queryset:從這個queryset中獲取指定的數據。
queryset的優先順序高於model
它所獲取的數據是通過context中object_list這個變數來傳遞的
django.views.generic.list.MultipleObjectTemplateResponseMixin
django.views.generic.base.TemplateResponseMixin
django.views.generic.list.BaseListView
django.views.generic.list.MultipleObjectMixin
django.views.gen
from blog.models import Post from django.views.generic import ListView class PublisherList(ListView): """ django.views.generic.list.ListView 對於ListView來說,它需要顯示的是多個object的信息,返回的是一個對象列表 URL配置: url(r'^publishers/(?P<match_title>\w+)$',views.PublisherList.as_view()), """ # 數據來源是`model`和`queryset`, 後者優先順序較高 model = Post # 返回所有對象 queryset = Post.objects.filter(title__contains = 'c') # 返回 title包含"c"的對象 context_object_name = 'publisher' # 沒有指定此參數時,上下文對象是 `object_list` template_name='post.html' # 模板 # 實現動態過濾,捕獲urls中的參數 def get_queryset(self): print("get_queryset") return Post.objects.filter(title__contains = self.kwargs['match_title'])
# 用於添加額外的上下文對象 def get_context_data(self, **kwargs): print("get_context_data") context = super(PublisherList, self).get_context_data(**kwargs) # 獲取上下文對象 context['nn'] = ['11', '22'] # 把{'nn':['11', '22']}添加到上下文對象 return context