我最近了解到,当您特别想要执行与默认视图不同的操作时,应该覆盖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呢?对我来说,他们似乎基本上做了同样的事情,或者我只是错过了什么?我可以一起用吗?对我来说,这是念力的主要来源.

所以重申一下:在什么情况下,我会使用超过get_querysetget_context_data,反之亦然?

推荐答案

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

GET()

这是一个顶级方法,每个HTTP谓词都有一个-GET()post()patch()等.当您希望在视图处理请求之前或之后执行某些操作时,可以覆盖它.但这仅在第一次加载表单视图时调用,而不是在提交表单时调用.Basic example in the documentation美元.默认情况下,它将只呈现配置的模板并返回HTML.

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 documentation on the subject美元.

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'])

获取上下文数据()

此方法用于填充字典以用作模板上下文.例如,在上述示例中,ListViewget_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>

现在来回答您的主要问题,您有这么多方法的原因是让您可以轻松地准确地粘贴您的自定义逻辑.它不仅使您的代码更具可读性和模块化,而且更易于测试.

The documentation应该可以解释一切.如果仍然不够,你可能会发现the sources也有帮助.您将看到所有内容都是如何使用Mixin实现的,这是唯一可能的,因为所有内容都是划分的.

Django相关问答推荐

自定义公钥打破Django管理内联逻辑

获取PyCharm中继承方法的未解析属性引用

我的Django终结点不访问HAS_OBJECT_PERMISSION方法

Django:作为模型中的列表元素的字段

更改Django的创建时间字段

Django中的InvalidOperation错误[]

在 Django 4.1 中提交表单之前显示数据

Django ORM 查询优化问题

可插拔应用程序的Django默认设置约定?

ImportError:无法导入设置

如何使用 django 发送 POST 请求?

Django -- User.DoesNotExist 不存在?

在 Django 应用程序之间共享模型

Celery - 在一台服务器上运行不同的工作人员

如何在 Django/Python 中减go 两个日期?

响应发送到客户端后在 Django 中执行代码

ProgrammingError: 安装 Psycopg2 后,关系django_session不存在错误

Django:验证上传文件的文件类型

django.core.servers.basehttp.FileWrapper 在 Django 1.9 中消失

关闭 Django Rest Framework ModelViewSet 的自动分页