当前位置: 首页 > 面试题库 >

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

姚浩歌
2023-03-14
问题内容

我最近了解到,当你特别想执行默认视图所不能做的事情时,应该重写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反之?


问题答案:

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

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>

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



 类似资料:
  • 问题内容: 我想知道何时在类中使用get和set方法(getName,setName),何时使用简单方法代替 这是使用set和get方法的类的示例 谢谢 问题答案: 使用Getters / Setters与使用Fields 根据经验: 使用直接来自同一类的变量(实际上来自同一.java文件,因此内部类也可以),使用其他类的Getters / Setters。

  • 问题内容: 我听说过redis-cache,但是它是如何工作的呢?通过以某种方式缓存rdbms查询,它是否被用作Django和我的rdbms之间的一层? 还是应该直接将其用作数据库?我对此表示怀疑,因为该github页面不包含任何登录详细信息,所以没有设置..只是告诉您设置一些config属性。 问题答案: 这个Redis的Python模块在自述文件中有一个清晰的用法示例:http : //git

  • 问题内容: 我正在尝试为我的Django对象获取唯一的ID。在Django 1.8中,它们具有UUIDField。我不确定如何使用此字段来为模型中的每个对象生成唯一的ID。 这是我对UUIDField的要求 我可以重现UUID模型的ID,但是每次我都得到完全相同的ID。:(。 例如: id然后每次都给我相同的id。怎么了,我该如何解决?感谢您的帮助! 问题答案: 我不确定为什么要创建UUID模型。

  • 问题内容: 从Internet的一些示例中,我做了下面的测试代码。有用! …但是,如果我重新加载页面,则饼图将使用相同的图像进行绘制。每次重新加载页面时,某些部件的颜色都会变深。当我重新启动开发服务器时,它将被重置。如何在Django中使用Matplotlib正确绘制?看起来好像还记得一些图纸… 源views.py(让urls.py链接到它): 我正在使用Django 1.0.1和Python 2

  • 问题内容: 我想用datepicker实现django表单。我做了我的forms.py views.py balance.html 而且在该表格的输入框中仍然没有日期选择器。我也尝试像在balance.html中一样在脚本中包含文件链接 datepicker仍然无法正常工作。但是,当在我的html文件中包含jquery时,这也使得我在我的html文件中实现的jquery-treetable无法工作

  • 我正在学习基于Django的课堂观点。我正在阅读Django文档,了解了queryset属性和get_queryset()方法。在谷歌搜索它们时,我发现了这个答案。 我试图用我的代码复制结果: 在回答中提到,当您设置queryset时,只在启动服务器时创建一次queryset。另一方面,对每个请求都调用get_queryset方法。 但是我可以在数据库中插入问题,并且它们可以在页面index2.h