在将我的博客从 WordPress 移动到 Django 时,我更改了永久链接的结构,之前它没有category
在结构中使用,现在它被使用了。或多或少是这样:
/slug/ ⟼ /cat/slug/
所以我收到了很多 404 错误,因为 Django 只搜索类别。所以我决定在类别的基于类的视图中添加一个查找器:
class CategoryDetail(ListView, CacheMixin):
model = Entry
paginate_by = 6
def get_queryset(self):
self.cat = get_object_or_404(Category, slug=self.kwargs['slug'])
return Entry.objects.filter(
category=self.cat, status=Entry.LIVE_STATUS).select_related() \
.order_by('-pub_date', 'id')
在函数中,如果对应于条目而不是类别,get_queryset
我想添加一个调用类的重定向。EntryDetail
slug
我这样做:
def get_queryset(self):
try:
entry = Entry.objects.get(slug=self.kwargs['slug'])
return redirect(entry)
except Entry.DoesNotExist:
pass
self.cat = get_object_or_404(Category, slug=self.kwargs['slug'])
return Entry.objects.filter(
category=self.cat, status=Entry.LIVE_STATUS).select_related() \
.order_by('-pub_date', 'id')
我使用slug
搜索输入(如果找不到,我捕获异常DoesNotExist
并继续查找类别),如果该条目存在,我将请求重定向到指示的输入,其中包含get_absolute_url()
指示的属性在文档中使用return redirect(entry)
. 但它不起作用。
redirect
如果我使用与 URL 模式匹配的这种形式,它也不起作用:
# En urls.py:
# url(r'^(?P<cat>[-\w]+)/(?P<slug>[-\w]+)/$', EntryDetail.as_view(), name="entry_detail")
return redirect('entry_detail', cat=entry.category, slug=entry.slug)
在这两种情况下,问题是我收到以下错误:
TypeError at /el-circulo/
object of type 'HttpResponseRedirect' has no len()
该函数len()
用于分页,因为我一直将响应发送到 CBV CategoryDetail
。
如何获得工作所需的措辞?
也就是说,我怎样才能离开请求调用的类并使用不同的类返回响应,在这种情况下使用EntryDetail
.
我想象错误:
发生这种情况是因为您返回的是 a
HttpResponseRedirect
而不是方法应该返回的查询集get_queryset
。正如我在评论中提到的,我认为这种方法不适合重定向。我要做的是将重定向传递给该方法
get
,并将查询集部分保留为您最初拥有的部分: