PageNotAnInteger в /products/ Этот номер страницы не является целым числом

#python #django

#питон #django

Вопрос:

Итак, я пытаюсь использовать разбивку на страницы в django, когда я нажимаю на предыдущий, это приводит меня к localhost:8000/thatpage/?page= тому, когда он должен привести меня к предыдущей странице, это также выдает мне ошибку на этой странице. Я пытался справиться с этим в своем views.py но это не работает. Я тоже пробовал использовать books_obj.previous_page_number , но это тоже не сработало. Я использую Django 3.1

views.py

 def showproducts(request):
    oof = CartItem.objects.filter(user=request.user).values_list('book', flat=True)
    lmao = OrderItem.objects.filter(user=request.user).values_list('book', flat=True)
    hehe = CartItem.objects.filter(user=request.user)
    category = Category.objects.all()
    haha = Paginator(Book.objects.all(), 2)
    page = request.GET.get('page')
    if page is None or "":
        page = 1
    fianlprice = 0
    for item in hehe:
        fianlprice  = item.book.price
    # books = Book.objects.all()
    books = haha.page(page)
    return render(request, 'main/products.html', {'books':books, 'price':fianlprice, 'cart':oof, 'order':lmao, 'category':category})
 

products.html

 <h1>Products</h1>
<h1>{{ error }}</h1>
{% if user.is_authenticated %}
<h1>Your cart currently costs ${{ price }}</h1>
{% else %}
<h1>Please login to view your cart</h1>
{% endif %}
<form method="GET" action="/search/">

    <label>Choose a category</label>

<select name="category" id="category">
    <option value="All" selected>All</option>
    {% for name in category %}
  <option value="{{ name.name }}">{{ name.name }}</option>
    {% endfor %}
</select>

    <input type="text" placeholder="Search here" name="search" id="search">
    <button type="submit">Search</button>
</form>
{% for book in books %}
<a href="{% url 'detailview' book.id %}"><h3>{{ book.name }}</h3></a>
<img src= "/media/{{ book.image }}" alt="">
<p>{{ book.description }}</p>
        {% if not user.is_authenticated %}
        <p>Please login</p>
        {% else %}
        {% if book.id in cart %}
        <form method="POST" action="/removefromcartforhome/">
            {% csrf_token %}
            <button type="submit" name="removeid" value="{{ book.id }}">remove item from cart</button>
        </form>
        {% elif book.id in order %}
        <h3>You already own this</h3>
        {% else %}
        <form method="POST" action="/addtocartforhome/">
            {% csrf_token %}
            <button type="submit" name="bookid" value="{{ book.id }}">Add to cart</button>
        </form>
    {% endif %}
        {% endif %}
{% endfor %}

{% if books.has_other_pages %}

    {% if books.has_previous %}
    <li class="page-item">
        <a href="?page={{books.previous_page_number}}" class="page-link">amp;laquo;</a>
    </li>
    {% else %}
    <li class="page-item disabled">
        <a class="page-link">amp;laquo;</a>
    </li>
    {% endif %}
    {% for i in books.paginator.page_range %}
        {% if books.number == i %}
        <li class="page-item active">
            <a class="page-link">{{i}}</a>
        </li>
        {% else %}
        <li class="page-item">
            <a href="?page={{i}}" class="page-link">{{i}}</a>
        </li>
        {% endif %}
    {% endfor %}
    {% if books.has_next %}
        <li class="page-item">
            <a href="?page={{books.next_page_number}}" class="page-link">amp;raquo;</a>
        </li>
    {% else %}
        <li class="page-item disabled">
            <a class="page-link">amp;raquo;</a>
        </li>
    {% endif %}

{% else %}
<p>no pages</p>

{% endif %}
 

Ответ №1:

Измените этот код с:

 if page is None or "":
    page = 1
 

Для

 page = request.GET.get('page', None)
if page == None or page == "":
    page = 1

# or
if not page:
    page = 1
 

Обновить

Вы можете использовать http referee для перенаправления на предыдущую страницу:

 if not page:
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
 

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

1. Это не исправит ссылку на 1-ю страницу, она должна перенаправлять на предыдущую, а не на первую страницу