我最近了解到,当您特别想执行默认视图所不能做的事情时,应该重写get方法:
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' }
这是很简单的,但是当我应该使用get_queryset或get_context_data过度get?在我看来,他们基本上都在做同样的事情,还是我只是想念一些东西?我可以一起使用吗?这是我感到困惑的主要根源。
get_queryset
get_context_data
get
因此,我要重申一下:在什么情况下,我会使用overget_queryset或get_context_data反之?
他们确实做了不同的事情。
get()
这是一个最高级的方法,而且也为每个HTTP动词- ,,等你会当你想之前请求由视图或后处理做点什么覆盖它。但这仅在首次加载表单视图时才调用,而不是在提交表单时调用。文档中的基本示例。默认情况下,它将仅呈现配置的模板并返回HTML。get()``post()``patch()
get()``post()``patch()
class MyView(TemplateView): # ... other methods def get(self, *args, **kwargs): print('Processing GET request') resp = super().get(*args, **kwargs) print('Finished processing GET request') return resp
get_queryset()
由ListViews使用- 它确定要显示的对象列表。默认情况下,它只会为您指定的模型提供全部功能。通过覆盖此方法,您可以扩展或完全替换此逻辑。有关该主题的Django文档。
ListView
class FilteredAuthorView(ListView): template_name = 'authors.html' model = Author def get_queryset(self): # original qs qs = super().get_queryset() # filter by a variable captured from url, for example return qs.filter(name__startswith=self.kwargs['name'])
get_context_data()
此方法用于填充字典以用作模板上下文。例如,ListViews将get_queryset()像author_list上面的示例一样填充的结果。您可能最经常重写此方法,以添加要显示在模板中的内容。
author_list
def get_context_data(self, **kwargs): data = super().get_context_data(**kwargs) data['page_title'] = 'Authors' return data
然后在模板中,您可以引用这些变量。
<h1>{{ page_title }}</h1> <ul> {% for author in author_list %} <li>{{ author.name }}</li> {% endfor %} </ul>
现在回答您的主要问题,您拥有这么多方法的原因是让您轻松地以精确度坚持自定义逻辑。它不仅使您的代码更具可读性和模块化,而且更具可测试性。
该文档应解释一切。如果还不够,您可能会发现这些资源也很有帮助。您将看到如何使用mixin来实现所有事情,这仅是因为一切都是分隔的。