1. 程式人生 > >Django通用檢視的get_queryset, get_context_data和get_object等方法

Django通用檢視的get_queryset, get_context_data和get_object等方法

Django通用檢視的get_queryset, get_context_data和get_object等方法

簡介:
Django提供了很多通用的基於類的檢視(class Base View),可以幫我簡化以下的程式碼操作。
這些基類的檢視還提供了get_queryset(),get_context_data(),get_object()等方法,以便我們更加靈活的運用他們。

前提:
展示物件列表比如所有使用者,所有文章)—ListView
展示某個物件的詳細資訊(比如使用者資料,比如使用者詳情)—DetailView
通過表單建立某個物件(比如建立使用者,新建文章)—CreateView
通過表單更新某個物件資訊(如修改密碼,修改文章內容)—UpdateView
使用者完成後轉到某個完成頁面—FormView
刪除某個物件 —DeleteView

1、Get_querySet():
該方法返回一個量身定製的物件列表,當我們使用django中自帶的Listview展示所有物件的列表時,listview預設會返回Model.object.all()
如果我們需要只展示文章列表或者倒序排序時,可以通過具體的get_queryset()方法來返回我們顯示的物件列表。
def get_queryset(self):
return Article.objects.filter(author = self.request.user).order_by(‘-pub_date’)

等同於

def get_queryset(self):
qs = super().get_queryset() # 呼叫父類方法
return qs.filter(author = self.request.user).order_by(‘-pub_date’)

2、get_context_data():
用於給模板傳遞模型以外的內容或引數,如把現在的時間傳遞給模板,可以通過重寫get_context_data()方法,因為呼叫了父類的方法:

from django.views.generic import ListView
from .models import Article
from django.utils import timezone

class IndexView(ListView):
queryset = Article.objects.all().order_by(“-pub_date”)
template_name = ‘blog/article_list.html’
context_object_name = ‘latest_articles’

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['now'] = timezone.now() #只有這行程式碼有用
    return context

3、get_object()方法:
DetailView和EditView都是從url根據pk或其他引數調取一個物件來進行後續操作。
比如:你希望使用者只能檢視或編輯自己發表的文章物件,當用戶檢視別人時,就返回http404錯誤。
from django.views.generic import DetailView
from django.http import Http404
from .models import Article
from django.utils import timezone

class ArticleDetailView(DetailView):
queryset = Article.objects.all().order_by(“-pub_date”)
template_name = ‘blog/article_detail.html’
context_object_name = ‘article’

def get_object(self, queryset=None):
    obj = super().get_object(queryset=queryset)
    if obj.author != self.request.user:
        raise Http404()
    return obj

三個分別負責向前端傳資料,獲取資料庫資料,獲取物件資料。