作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想编写一个 except 子句,如果查询集中没有内容,则重定向用户。欢迎任何建议。我是一个 Python 菜鸟,我知道这是这里的问题。
这是我当前的代码:
def get_queryset(self):
try:
var = Model.objects.filter(user=self.request.user, done=False)
except:
pass
return var
我想做这样的事情:
def get_queryset(self):
try:
var = Model.objects.filter(user=self.request.user, done=False)
except:
redirect('add_view')
return var
最佳答案
get_queryset
方法中的 try except block 并不真正合适。首先,如果查询集为空,Model.objects.filter()
不会引发异常——它只是返回一个空查询集。其次,get_queryset
方法旨在返回一个查询集,而不是 HttpResponse
,因此如果您尝试在该方法内进行重定向,您会遇到问题。
我认为您可能会发现编写基于函数的 View 更容易。第一次尝试可能如下所示:
from django.shortcuts import render
def my_view(request):
"""
Display all the objects belonging to the user
that are not done, or redirect if there are not any,
"""
objects = Model.objects.filter(user=self.request.user, done=False)
if not objects:
return HttpResponseRedirect("/empty-queryset-url/")
return render(request, 'myapp/template.html', {"objects": objects})
优点是您的函数流程非常简单。它没有基于 ListView
通用类的 View 那么多的功能(例如它缺少分页),但任何阅读您的代码的人都非常清楚 View 在做什么。
如果你真的想使用基于类的 View ,你必须深入研究 CBV documentation for multiple object mixins和 source code ,并找到合适的方法来覆盖。
在这种情况下,您会发现 ListView
的行为与您想要的完全不同,因为它从不重定向。默认情况下它会显示一个空页面,如果您设置 allow_empty = False
,它会显示一个 404 页面。我认为您必须重写 get
方法才能看起来像这样(未经测试)。
class MyView(ListView):
def get_queryset(self):
return Model.objects.filter(user=self.request.user, done=False)
def get(self, request, *args, **kwargs):
self.object_list = self.get_queryset()
if len(self.object_list == 0):
return HttpResponseRedirect("/empty-queryset-url/")
context = self.get_context_data(object_list=self.object_list)
return self.render_to_response(context)
关于django - 如何在 Django 通用类 View 中编写基本的 try/except,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11019164/
我是一名优秀的程序员,十分优秀!