2017-03-04 10 views
0

私はdjangoアプリケーションでdiggスタイルのページネーションを作成しています。私はカスタムテンプレートタグを使用しました。最初と最後のページはうまくいきませんでした。私はそれを修正する方法を理解していません。しかし、他のページは正常に動作します。私は間違っていた?DjangoページネーションのEmptyPageエラー

最初のページのエラー: EmptyPage:そのページ番号が1未満

Traceback (most recent call last): 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\exception.py", line 39, in inner 
    response = get_response(request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\views.py", line 20, in project_list 
    return render(request, 'project/project_list.html', {'projects': projects, 'paginator': paginator}) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\shortcuts.py", line 30, in render 
    content = loader.render_to_string(template_name, context, request, using=using) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader.py", line 68, in render_to_string 
    return template.render(context, request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\backends\django.py", line 66, in render 
    return self.template.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 208, in render 
    return self._render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader_tags.py", line 174, in render 
    return compiled_parent._render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader_tags.py", line 70, in render 
    result = block.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\library.py", line 225, in render 
    _dict = self.func(*resolved_args, **resolved_kwargs) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\templatetags\pagination.py", line 48, in custom_paginator 
    'previous': page_obj.previous_page_number(), 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\paginator.py", line 136, in previous_page_number 
    return self.paginator.validate_number(self.number - 1) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\paginator.py", line 38, in validate_number 
    raise EmptyPage('That page number is less than 1') 
django.core.paginator.EmptyPage: That page number is less than 1 

最後のページのエラー:このページには何の結果

Traceback (most recent call last): 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\exception.py", line 39, in inner 
    response = get_response(request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\views.py", line 20, in project_list 
    return render(request, 'project/project_list.html', {'projects': projects, 'paginator': paginator}) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\shortcuts.py", line 30, in render 
    content = loader.render_to_string(template_name, context, request, using=using) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader.py", line 68, in render_to_string 
    return template.render(context, request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\backends\django.py", line 66, in render 
    return self.template.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 208, in render 
    return self._render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader_tags.py", line 174, in render 
    return compiled_parent._render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader_tags.py", line 70, in render 
    result = block.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\library.py", line 225, in render 
    _dict = self.func(*resolved_args, **resolved_kwargs) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\templatetags\pagination.py", line 48, in custom_paginator 
    'previous': page_obj.previous_page_number(), 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\paginator.py", line 136, in previous_page_number 
    return self.paginator.validate_number(self.number - 1) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\paginator.py", line 38, in validate_number 
    raise EmptyPage('That page number is less than 1') 
django.core.paginator.EmptyPage: That page number is less than 1 
[04/Mar/2017 19:13:59] "GET /ru/account/dashboard/project/list/?page=1 HTTP/1.1" 500 152849 
Internal Server Error: /ru/account/dashboard/project/list/ 
Traceback (most recent call last): 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\exception.py", line 39, in inner 
    response = get_response(request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\views.py", line 20, in project_list 
    return render(request, 'project/project_list.html', {'projects': projects, 'paginator': paginator}) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\shortcuts.py", line 30, in render 
    content = loader.render_to_string(template_name, context, request, using=using) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader.py", line 68, in render_to_string 
    return template.render(context, request) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\backends\django.py", line 66, in render 
    return self.template.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 208, in render 
    return self._render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader_tags.py", line 174, in render 
    return compiled_parent._render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 199, in _render 
    return self.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\loader_tags.py", line 70, in render 
    result = block.nodelist.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 994, in render 
    bit = node.render_annotated(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\base.py", line 961, in render_annotated 
    return self.render(context) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\template\library.py", line 225, in render 
    _dict = self.func(*resolved_args, **resolved_kwargs) 
    File "C:\Users\Nurzhan\PycharmProjects\RMS\project\templatetags\pagination.py", line 49, in custom_paginator 
    'next': page_obj.next_page_number(), 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\paginator.py", line 133, in next_page_number 
    return self.paginator.validate_number(self.number + 1) 
    File "C:\Users\Nurzhan\AppData\Local\Programs\Python\Python35-32\lib\site-packages\django\core\paginator.py", line 43, in validate_number 
    raise EmptyPage('That page contains no results') 
django.core.paginator.EmptyPage: That page contains no results 
[04/Mar/2017 19:16:12] "GET /ru/account/dashboard/project/list/?page=12 HTTP/1.1" 500 152777 

views.pyが含まれていませんEmptyPage

def project_list(request): 
    objects = Project.objects.filter(status='public', membership__user=request.user) 
    paginator = Paginator(objects, 1) 

    page = request.GET.get('page') 
    try: 
     projects = paginator.page(page) 
    except PageNotAnInteger: 
     # If page is not an integer, deliver first page. 
     projects = paginator.page(1) 
    except EmptyPage: 
     # If page is out of range (e.g. 9999), deliver last page of results. 
     projects = paginator.page(paginator.num_pages) 

    return render(request, 'project/project_list.html', {'projects': projects, 'paginator': paginator}) 

pagination.py

from django import template 

register = template.Library() 

LEADING_PAGE_RANGE_DISPLAYED = TRAILING_PAGE_RANGE_DISPLAYED = 5 
LEADING_PAGE_RANGE = TRAILING_PAGE_RANGE = 4 
NUM_PAGES_OUTSIDE_RANGE = 2 
ADJACENT_PAGES = 2 


def custom_paginator(context): 
    paginator = context['paginator'] 
    page_obj = context['projects'] 
    pages = paginator.num_pages 
    page = page_obj.number 
    in_leading_range = in_trailing_range = False 
    pages_outside_leading_range = pages_outside_trailing_range = range(0) 
    if pages <= LEADING_PAGE_RANGE_DISPLAYED + NUM_PAGES_OUTSIDE_RANGE + 1: 
     in_leading_range = in_trailing_range = True 
     page_range = [n for n in range(1, pages + 1)] 
    elif page <= LEADING_PAGE_RANGE: 
     in_leading_range = True 
     page_range = [n for n in range(1, LEADING_PAGE_RANGE_DISPLAYED + 1)] 
     pages_outside_leading_range = [n + pages for n in range(0, -NUM_PAGES_OUTSIDE_RANGE, -1)] 
    elif page > pages - TRAILING_PAGE_RANGE: 
     in_trailing_range = True 
     page_range = [n for n in range(pages - TRAILING_PAGE_RANGE_DISPLAYED + 1, pages + 1) if 0 < n <= pages] 
     pages_outside_trailing_range = [n + 1 for n in range(0, NUM_PAGES_OUTSIDE_RANGE)] 
    else: 
     page_range = [n for n in range(page - ADJACENT_PAGES, page + ADJACENT_PAGES + 1) if 0 < n <= pages] 
     pages_outside_leading_range = [n + pages for n in range(0, -NUM_PAGES_OUTSIDE_RANGE, -1)] 
     pages_outside_trailing_range = [n + 1 for n in range(0, NUM_PAGES_OUTSIDE_RANGE)] 

    request = context['request'] 
    params = request.GET.copy() 
    if 'page' in params: 
     del (params['page']) 
    get_params = params.urlencode() 

    return { 
     'pages': pages, 
     'page': page, 
     'previous': page_obj.previous_page_number(), 
     'next': page_obj.next_page_number(), 
     'has_previous': page_obj.has_previous(), 
     'has_next': page_obj.has_next(), 
     'page_range': page_range, 
     'in_leading_range': in_leading_range, 
     'in_trailing_range': in_trailing_range, 
     'pages_outside_leading_range': pages_outside_leading_range, 
     'pages_outside_trailing_range': pages_outside_trailing_range, 
     'get_params': get_params, 
    } 


register.inclusion_tag("project/pagination.html", takes_context=True)(custom_paginator) 

project_list.html

{% for project in projects %} 
    *** LIST OF PROJECTS HERE *** 
{% endfor %} 
{% custom_paginator %} 

pagination.html

{% spaceless %} 
    {% if has_previous %} 
    <li><a href="{% if get_params %}?{{ get_params }}&{% else %}?{% endif %}page={{ previous }}">&laquo; Prev</a></li> 
    {% endif %} 
    {% if not in_leading_range %} 
    {% for p in pages_outside_trailing_range %} 
     <li><a href="{% if get_params %}?{{ get_params }}&{% else %}?{% endif %}page={{ p }}">{{ p }}</a></li> 
    {% endfor %} 
    <li><span class="ellipsis">...</span></li> 
    {% endif %} 
    {% for p in page_range %} 
    {% if p == page %} 
     <li><span class="active">{{ p }}</span></li> 
    {% else %} 
     <li><a href="{% if get_params %}?{{ get_params }}&{% else %}?{% endif %}page={{ p }}">{{ p }}</a></li> 
    {% endif %} 
    {% endfor %} 
    {% if not in_trailing_range %} 
    <li><span class="ellipsis">...</span></li> 
    {% for p in pages_outside_leading_range reversed %} 
     <li><a href="{% if get_params %}?{{ get_params }}&{% else %}?{% endif %}page={{ p }}">{{ p }}</a></li> 
    {% endfor %} 
    {% endif %} 
    {% if has_next %} 
    <li><a href="{% if get_params %}?{{ get_params }}&{% else %}?{% endif %}page={{ next }}">Next &raquo;</a></li> 
    {% endif %} 
{% endspaceless %} 
+0

何のためにそのcustom_paginatorテンプレートタグであり、そしてどこにそれを使用していますか?また、最後の数行だけでなく、完全なトレースバックを表示する必要があります。 –

+0

@DanielRoseman完全なトレースバックと私のproject_list.htmlファイルで使用するcustom_paginatorで自分の投稿を更新します。このエラーを修正する方法はありますか? –

答えて

1

トレースバックエラーが中に発生していることを示しますあなたのテンプレートタグ。 has_previoushas_nextがTrueを返すかどうかを確認せずにprevious_page_numbernext_page_numberと呼び出します。

しかし、私はあなたがそれをやる理由は分かりません。 page_objを渡し、テンプレート内のメソッドを直接呼び出してください。

{% if page_obj.has_previous %} 
    <li><a href="{% if get_params %}?{{ get_params }}&{% else %}?{% endif %}page={{ page_obj.previous_page_number }}">&laquo; Prev</a></li> 
{% endif %} 

など

関連する問題