gpt4 book ai didi

python - 什么时候在Django中使用get、get_queryset、get_context_data?

转载 作者:IT老高 更新时间:2023-10-28 20:33:57 26 4
gpt4 key购买 nike

我最近了解到,当您特别想要执行默认 View 以外的操作时,您应该重写 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 over get_querysetget_context_data,反之亦然?

最佳答案

他们确实做不同的事情。

get()

这是一个顶级方法,每个 HTTP 动词都有一个 - get()post()patch() 等。当您想要在 View 处理请求之前或之后执行某些操作时,您将覆盖它。但这只在第一次加载表单 View 时调用,而不是在提交表单时调用。 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'])

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>

现在回答您的主要问题,之所以有这么多方法,是为了让您轻松准确地坚持自定义逻辑。它不仅使您的代码更具可读性和模块化,而且更易于测试。

The documentation应该解释一切。如果还不够,可以找the sources也很有帮助。您将看到一切都是如何使用 mixins 实现的,这一切都是因为一切都被分隔开来的。

关于python - 什么时候在Django中使用get、get_queryset、get_context_data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36950416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com