当页码无效时,Django给我404错误(例如localhost /?page = 9999)。
但我想将它重定向到第一页。在基于函数的视图中,这可以通过捕获InvalidPage异常来完成。
有没有人知道如何在基于类的视图中执行此操作。
提前致谢。
答案 0 :(得分:1)
之前的答案都没有为我解决问题。也许他们曾经这样做过。这是我使用django 1.3.1的方式:
def get(self, *args, **kwargs):
request = self.request
try:
return super(MyListView, self).get(*args, **kwargs)
except Http404:
if request.GET.get('page', 1) == 1:
raise
page1 = request.GET.copy()
del page1['page']
return redirect('%s?%s' % (request.path, page1.urlencode()))
我进行重定向,因为我不希望人们认为网址有效 - 没有网页N,我们希望正确反映我们将其发送回第1页。
答案 1 :(得分:0)
致电get_context_data
并抓住Http404
而不是InvalidPage
然后将页面值指定为1,并调用get_context_data
。
class MyListView(ListView):
def get_context_data(self, **kwargs):
try:
return super(MyListView, self).get_context_data(**kwargs)
except Http404:
self.kwargs['page'] = 1
return super(MyListView, self).get_context_data(**kwargs)
更多信息:
https://code.djangoproject.com/browser/django/trunk/django/views/generic/list.py#L33
https://code.djangoproject.com/browser/django/trunk/django/views/generic/list.py#L84
答案 2 :(得分:0)
只需覆盖get_context_data
课程中的ListView
方法即可。它在我的项目中运行良好。只需使用@Coc B中的代码。
当然记得将MyListView
替换为您的班级名称。
答案 3 :(得分:0)
这对我有用,请覆盖paginate_queryset
:
class MyListView(ListView):
def paginate_queryset(self, queryset, page_size):
try:
return super(MyListView, self).paginate_queryset(queryset, page_size)
except Http404:
self.kwargs['page'] = 1 # return page 1 instead
return super(MyListView, self).paginate_queryset(queryset, page_size)
答案 4 :(得分:-1)
在您的课程中覆盖get_paginator
并在那里执行检查。然后覆盖dispatch
以重定向或返回普通视图:
class MyListView(ListView):
...
def get_paginator(self, queryset, per_page, orphans=0, allow_empty_first_page=True):
paginator = super(MyListView, self).get_paginator(queryset, per_page, orphans=orphans, allow_empty_first_page=allow_empty_first_page)
try:
paginator.page(self.kwargs.get('page', 1))
except EmptyPage: # or InvalidPage, but that's less precise
self.is_empty = True
return paginator
def dispatch(self, request, *args, **kwargs):
response = super(MyListView, self).dispatch(request, *args, **kwargs)
if getattr(self, 'is_empty', False):
return HttpResponseRedirect('/some/other/url/')
else:
return response