2016-04-28 13 views
1

Ich habe Django gelernt und eine Quelle der Verwirrung, die ich habe, ist mit klassenbasierten Ansichten und wann die Get-Methode zu überschreiben ist. Ich habe mir die Dokumentation durchgelesen und es erklärt, was geht, aber es erklärt nicht, wann ich es außer Kraft setzen soll.Wann überschreiben Sie Methode in Django CBV?

Ich habe ursprünglich einen Blick auf diese Weise:

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) 

Aber ich war vor kurzem gesagt, dass mein Code von genug für die Standardimplementierung einfach war, und dass alles, was ich dies erforderlich war:

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

Also meine Frage ist das: In welchem ​​Szenario/Situation sollte ich die Get-Methode überschreiben?

Antwort

3

Wenn Sie die eingebauten generischen Ansichten verwenden, dann sollten Sie selten get() außer Kraft zu setzen haben. Sie werden entweder viele Funktionen duplizieren oder Features der Ansicht brechen.

Zum Beispiel wird die Option paginate_by in Ihrer Ansicht nicht mehr funktionieren, weil Sie das Abfrage-Set in Ihrer get()-Methode nicht schneiden.

Wenn Sie eine generische klassenbasierte Ansicht wie ListView verwenden, sollten Sie versuchen, bestimmte Attribute oder Methoden, falls möglich, außer Kraft zu setzen, statt get() zu überschreiben.

Der Vorteil Ihrer Ansicht, die get() überschreibt, ist, dass es sehr klar ist, was es tut. Sie können sehen, dass die Ansicht ein Abfrageset abruft, in einen Kontext einfügt und anschließend die Vorlagen rendert. Sie müssen nicht über ListView wissen, um die Ansicht zu verstehen.

Wenn Sie die explizite Überschreibung get() Unterklasse View stattdessen mögen. Sie verwenden keines der Features von ListView, daher ist es nicht sinnvoll, es zu unterklassifizieren.

from django.views.generic import View 

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

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

Sie sollten die get Methode überschreiben, wenn Sie speziell etwas anderes als die Standardansicht tun möchten. In diesem Fall macht Ihr Code nichts anderes als das Rendern der Vorlage mit der Liste aller Objekte EmployeeProfile, was genau das ist, was der generische ListView tun würde.

Sie können es überschreiben, wenn Sie etwas komplizierteres tun möchten. Zum Beispiel, vielleicht möchten Sie auf URL-Parameter filtern:

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

Beachten Sie, dass dieses Beispiel noch erfordert Sie nicht außer Kraft setzen 'get()' - wäre es besser, außer Kraft zu setzen [ 'get_queryset()'] (https://docs.djangoproject.com/en/ 1.9/ref/klassenbasierte Ansichten/mixins-multiple-object/# django.views.generic.list.MultipleObjectMixin.get_queryset). – Alasdair

Verwandte Themen