什么时候在Django中使用get get_queryset get_context_data

我最近了解到,当你特别想做一些不同于默认视图的事情时,你应该重写 get 方法:

我最近了解到,当你特别想做一些不同于默认视图的事情时,你应该重写 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 overget_querysetget_context_data,反之亦然?

207

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

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

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

现在来回答你的主要问题,你有这么多方法的原因是让你轻松地坚持你的自定义逻辑与 pin-point 精度,它不仅让你的代码更具可读性和模块化,而且更可测试。

The documentation应该解释一切。如果仍然不够,您可能会发现the sources也很有帮助。您将看到如何使用 mixins 实现所有内容,因为所有内容都是分隔的。

14

让我们看看 ListView 的get方法的默认实现:

https://github.com/django/django/blob/92053acbb9160862c3e743a99ed8ccff8d4f8fd6/django/views/generic/list.py#L158
class BaseListView(MultipleObjectMixin, View):
    """
    A base view for displaying a list of objects.
    """
    def get(self, request, *args, **kwargs):
        self.object_list = self.get_queryset()
        allow_empty = self.get_allow_empty()
        if not allow_empty:
            # When pagination is enabled and object_list is a queryset,
            # it's better to do a cheap query than to load the unpaginated
            # queryset in memory.
            if (self.get_paginate_by(self.object_list) is not None
                    and hasattr(self.object_list, 'exists')):
                is_empty = not self.object_list.exists()
            else:
                is_empty = len(self.object_list) == 0
            if is_empty:
                raise Http404(_("Empty list and '%(class_name)s.allow_empty' is False.")
                        % {'class_name': self.__class__.__name__})
        context = self.get_context_data()
        return self.render_to_response(context)

您会注意到get_queryset在第一行中被调用。如果您只想在应用一些过滤 / 排序等后返回模型的查询集,则可以简单地覆盖它。

您不需要覆盖整个get方法,因为您将缺少所有这些提供的功能,即分页,404 检查等。

get_context_data将生成的查询集与上下文数据(如用于分页的查询字符串参数等)合并在一起。

我建议每隔一段时间检查 django 的源代码,并尝试理解它一点,以便您可以识别可以覆盖 / 替换的最合适的方法。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(3)
在没有基本身份验证的情况下将ExchangeOnline与 Powershell连接
上一篇
用PySpark加载CSV文件
下一篇

相关推荐

  • 什么是cem:django.template.loaders.app_directories 加载程序找不到模板文件

    关于什么是cem的问题,在cem template loader中经常遇到,模板文件保存在应用程序目录下,但在呈现时会引发 TemplateDoesNotExist 异常:…

    2022-11-27 02:41:11
    0 33 26
  • python怎么安装django:如何使用Python安装Django

    确保安装了Python,并且Python的版本大于3.5。使用pip安装Django,在终端/命令行中输入以下代码:…

    2023-03-25 15:56:32
    0 62 90
  • cvt和自动挡哪个好提升驾驶体验的最佳选择

    CVT(可变转换器)是一种由传动带及传动轮组成的无级变速器,它可以在没有传动档位的情况下,根据驾驶者的驾驶习惯,自动调整传动轮之间的转速比,从而实现无级变速。自动挡是指车辆自动变速箱,它使用液力传动来实现变速,可以自动适应车辆的行驶状态,减少司机的疲劳,提高行车的舒适性。…

    2023-06-08 07:42:19
    0 64 36
  • cv一叶扁舟和清影轩阳:漫游在一叶扁舟和清影轩阳之间

    cv一叶扁舟是一款开源的计算机视觉库,用于图像处理、计算机视觉等。它提供了丰富的API,可以帮助开发者快速实现各种图像处理任务,如图像分割、目标检测、图像识别等。清影轩阳是一款开源的计算机视觉框架,用于图像处理、目标检测、分类等。它提供了丰富的API,可以帮助开发者快速实现各种图像处理任务,如图像分割、目标检测、图像识别等。…

    2023-08-05 07:06:20
    0 18 65
  • css设置滚动条宽度设置:This is a title

    CSS设置滚动条宽度的方法:使用CSS3的。-webkit-属性:…

    2023-06-06 10:53:01
    0 43 57
  • xl和xe汽车cvt:探索XL和XE汽车的CVT技术优势

    XL和XE汽车CVT是一种变速器,它使用液力变矩器代替传统的机械变速器,以达到更高的效率。它的工作原理是,当发动机输出功率时,液力变矩器就会将这些功率转换为液压能量,然后将能量传递到变速器的输出轴上,从而实现变速。…

    2023-04-09 00:41:04
    0 65 26
  • cordon bleu是什么意思:法式炸鸡卷——Cordon Bleu的经典之作

    Cordon Bleu是一种烹饪技术,其中肉片被置于奶酪和火腿之间,然后用面包屑裹上,最后煎炸或烤熟。这种技术通常用于制作鸡肉,但也可以用于制作其他类型的肉类,如牛肉或猪肉。…

    2024-01-27 15:13:30
    0 96 82
  • countif 非空:非空单元格的计数

    Countif 非空是指计算某个单元格不为空的数量。代码如下:…

    2023-04-22 15:54:15
    0 43 12

发表评论

登录 后才能评论

评论列表(19条)