一尘不染

何时在Django中使用get,get_queryset,get_context_data?

django

我最近了解到,当你特别想执行默认视图所不能做的事情时,应该重写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_querysetget_context_data过度get?在我看来,他们基本上都在做同样的事情,还是我只是想念一些东西?我可以一起使用吗?这是我感到困惑的主要根源。

因此,我要重申一下:在什么情况下,我会使用over get_queryset或get_context_data反之?


阅读 687

收藏
2020-03-29

共1个答案

一尘不染

他们确实做了不同的事情。

get()

这是一个最高级的方法,而且也为每个HTTP动词- ,,get() 等你会当你想之前请求由视图或后处理做点什么覆盖它。但这仅在第一次加载表单视图时才调用,而不是在提交表单时调用。文档中的基本示例。默认情况下,它将仅呈现配置的模板并返回HTML。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文档。

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上面的示例一样填充的结果。你可能最经常重写此方法,以添加要显示在模板中的内容。

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>

现在回答你的主要问题,你之所以拥有如此众多的方法,是为了让你轻松地精确定位你的自定义逻辑。它不仅使你的代码更具可读性和模块化,而且更具可测试性。

2020-03-29