Страница Django paginator возвращает нетипичный результат

#python #django #pagination

#python #django #разбивка на страницы

Вопрос:

Я выполняю простой поиск с помощью Django и использую встроенную разбивку на страницы для разбиения результатов на страницы, и я получаю эту ошибку, когда нажимаю next, чтобы просмотреть результаты следующей страницы, аргумент int () должен быть строкой, байтоподобным объектом или числом, а не ‘NoneType’ Я не знаю, что это вызывает, вот код, q — строка запроса

 def result(request):
    try:
        q = request.GET.get('q')
        orders = Order.objects.filter(Q(flat_number=int(q)) | Q(customer_contact=int(q)))
        paginator = Paginator(orders, 10) # Show 25 contacts per page
        page = request.GET.get('page')
        orders = paginator.get_page(page)
        context['orders'] = orders
        return render(request, 'main/results.html',context)
    except Exception as e:
        print('error is ', e)
        return HttpResponse(str(e))

  

Комментарии:

1. Не могли бы вы показать пример запроса, который вы делаете, т. Е. Полный URL, который вы посещаете, чтобы столкнуться с этой проблемой?

Ответ №1:

В request.GET.get('q') он вернет None, если q не передается как parm в вызове get.

Изменение его на request.GET['q'] вызовет исключение, если q не передан

Комментарии:

1. Спасибо за ваш ответ, Мэтьюз, я изменил его на запрос. ПОЛУЧАЕМ[‘q’], но он вызывает и MultiValueDictKeyError в /result/ ‘q’

Ответ №2:

Вот пример того, как работать с модулем разбиения на страницы, для пустых страниц и т.д.

 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


def post_list(request): #list items
    queryset_list = Post.objects.all() #.order_by("-timestamp")

    query = request.GET.get("q")
    if query:
        queryset_list = queryset_list.filter(
            Q(title__icontains=query) |
            Q(content__icontains=query)


            ).distinct()

    paginator = Paginator(queryset_list, 10) # Show 25 contacts per page
    page_request_var = "page"
    page = request.GET.get(page_request_var)
    try:
        queryset = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        queryset = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        queryset = paginator.page(paginator.num_pages)
    context = {
        "object_list": queryset,
        "title": "Building stuff with code",
        "page_request_var" : page_request_var
    }
    return render(request, "post_list.html", context)
  

Ответ №3:

попробуйте сделать это следующим образом

 def result(request):
    try:
        q = request.GET.get('q')
        orders = Order.objects.filter(Q(flat_number=int(q)) | 
         Q(customer_contact=int(q)))
        paginator = Paginator(orders, 10) # Show 25 contacts per page
        page = request.GET.get('page')
        try:
            pots = paginator.page(page)
        except PageNotAnInteger:
            posts = paginador.page(1)
        except EmptyPage:
            posts = paginador.page(1)
        context['orders'] = post
        return render(request, 'main/results.html',context)


    except Exception as e:
        print('error is ', e)
        return HttpResponse(str(e))