2016-04-28 64 views
1

我一直在學習Django,我有一個混淆的來源是基於類的視圖以及何時重寫get方法。我查看了文檔,它解釋了什麼,但它不能解釋什麼時候應該重寫get。何時重寫Django CBV中的get方法?

我最初創建一個視圖是這樣的:

class ExampleView(generic.ListView): 
    template_name = 'ppm/ppm.html' 
    paginate_by = 5 

    def get(self, request): 
     profiles_set = EmployeeProfile.objects.all() 
     context = { 
      'profiles_set': profiles_set, 
      'title': 'Employee Profiles' 
     } 
     return render(request, self.template_name, context) 

但我最近告訴我的代碼很簡單的足夠的默認實現,所有我需要的是這樣的:

class ExampleView(generic.ListView): 
    model = EmployeeProfile 
    template_name = 'ppm/ppm.html' 

所以我的問題是這樣的:在什麼情況/情況下我應該重寫get方法?

回答

3

如果您使用的是內置的通用視圖,那麼你應該很少有覆蓋get()。你最終會複製很多功能,或者中斷視圖的功能。

例如,paginate_by選項將不再適用於您的視圖,因爲您沒有在get()方法中對查詢集進行切片。

如果您使用的是像ListView這樣的通用基於類的視圖,則應嘗試在可能的情況下覆蓋特定的屬性或方法,而不是覆蓋get()

您認爲優先於get()的優勢在於它非常清楚它的功能。您可以看到該視圖提取了一個查詢集,將其包含在上下文中,然後呈現模板。你不需要知道ListView就能理解視圖。

如果您喜歡替代覆蓋get()子類View的明確性。您沒有使用ListView的任何功能,因此將其繼承是沒有意義的。

from django.views.generic import View 

class ExampleView(View): 
    template_name = 'ppm/ppm.html' 

    def get(self, request): 
     ... 
0

當您特別想要執行默認視圖以外的操作時,您應該重寫get方法。在這種情況下,除了使用所有EmployeeProfile對象的列表呈現模板之外,您的代碼不會執行任何操作,這正是通用的ListView會執行的操作。

如果你想做更復雜的事情,你可以重寫它。比如,也許你想基於URL參數過濾:

class ExampleView(generic.ListView): 
    template_name = 'ppm/ppm.html' 

    def get(self, request): 
     manager = request.GET.get('manager', None) 
     if manager: 
      profiles_set = EmployeeProfile.objects.filter(manager=manager) 
     else: 
      profiles_set = EmployeeProfile.objects.all() 
     context = { 
      'profiles_set': profiles_set, 
      'title': 'Employee Profiles' 
     } 
     return render(request, self.template_name, context) 
+3

注意這個例子還是不需要你覆蓋'得到()' - 這將是更好的覆蓋['get_queryset()'](https://docs.djangoproject.com/en/ 1.9/ref/class-based-views/mixins-multiple-object /#django.views.generic.list.MultipleObjectMixin.get_queryset)。 – Alasdair