何时重写 Django CBV 中的 get 方法?

nas*_*yn8 0 python django django-class-based-views

我一直在学习 Django,我的困惑来源之一是基于类的视图以及何时重写 get 方法。我查看了文档,它解释了 get 的作用,但没有解释何时应该覆盖 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)
Run Code Online (Sandbox Code Playgroud)

但最近有人告诉我,我的代码对于默认实现来说足够简单,而我所需要的就是这样:

class ExampleView(generic.ListView):
    model = EmployeeProfile
    template_name = 'ppm/ppm.html'
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:在什么场景/情况下我应该重写 get 方法?

Ala*_*air 5

如果您使用内置的通用视图,那么您很少需要重写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):
        ...
Run Code Online (Sandbox Code Playgroud)