什么时候重写Django CBV中的get方法?

时间:2016-04-28 17:27:11

标签: 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)

但我最近被告知我的代码对于默认实现来说已经足够简单了,而我所需要的只是:

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

所以我的问题是:在什么情况/情况下我应该覆盖get方法?

2 个答案:

答案 0 :(得分: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):
        ...

答案 1 :(得分:0)

当您特别想要执行默认视图以外的操作时,您应该覆盖<table> <tr> <td class="tablerow mdl-data-table__cell--non-numeric" style="background-color:red;padding:0 !important"> <div style="background-color:green; border-radius: 100%; width:auto; height:100%;"> </div> </td> </tr> </table>方法。在这种情况下,除了使用所有get对象的列表呈现模板之外,您的代码不会执行任何操作,这正是通用EmployeeProfile所做的。

如果您想要做一些更复杂的事情,可以覆盖它。例如,您可能希望根据URL参数进行过滤:

ListView