我一直在学习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方法?
答案 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