Django: Не удается получить значение ответа GET - AttributeError: модуль 'django.http.request' не имеет атрибута 'GET'

Я пытаюсь создать простое приложение, которое собирает данные об обуви, а затем отображает их в виде списка. Я хочу использовать пагинацию, что довольно просто с помощью Django's paginator. Моя проблема в том, что я не могу заставить Django отдать мне значение, отправленное в GET-запросе.

Согласно Django docs то, что я делаю, должно работать. Я пробовал это с request и HttpRequest и каждый раз получаю ошибку "нет атрибута".

Ниже приведен код, который я имею в файле views.py.

from django.views.generic import ListView
from django.http import HttpRequest, request

from .models import Shoes


class ShoeListView(ListView):
    model = Shoes
    template_name = 'shoes/shoes-list.html'
    context_object_name = 'shoes'
    if request.method == "GET":
        shoespp = request.GET['shoespp']
    else:
        shoespp = 2
    paginate_by = shoespp

А это мой шаблон.

<body>
    <h1>Shoes</h1>
    <h2>List of Shoes</h2>
    <form method="get">
        <select name="shoespp">
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
        </select>
        <input type="submit" value="List Shoes">
    </form>

    <ul>
        {%for pair in shoes %}
        <li>
            <strong>{{ pair }} <em>{{ pair.brand }}</em></strong> <em>{{ pair.colorway }}</em> - {{ pair.size }}
        </li>
        {% endfor %}
    </ul>

    <p>
        {% if page_obj.has_previous %}
        <a href="?page=1"><button>&laquo; first</button></a>
        <a href="?page={{ page_obj.previous_page_number }}"><button>previous</button></a>
        {% endif %}

        <span>
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
        <a href="?page={{ page_obj.next_page_number }}"><button>next</button></a>
        <a href="?page={{ page_obj.paginator.num_pages }}"><button>last &raquo; </button></a>
        {% endif %}
    </p>
</body>

Может ли кто-нибудь указать мне, где я ошибаюсь? У меня нет ни одной идеи, и я безуспешно искал возможный ответ. Заранее спасибо.

В вашем текущем коде он выполняет request.GET в самом начале - еще до того, как он отправит HTML в браузер и пользователь сможет нажать на List shoes.

Я думаю, что это должно быть в какой-то функции, которая выполняется, когда сервер получает запрос от браузера.

Но другая проблема может быть в том, что эта страница отправляет GET, используя <form>, но также каждая ссылка в пагинации отправляется как GET, поэтому вам нужно проверить, действительно ли shoespp была отправлена

Я не могу проверить это, но это может быть что-то вроде этого

class ShoeListView(ListView):
    model = Shoes
    template_name = 'shoes/shoes-list.html'
    context_object_name = 'shoes'

    paginate_by = 2  # set some value at start

    def get_context_data(self, **kwargs):
        # change value when get new value from browser
        if 'shoespp' in self.request.GET:
             self.paginate_by = self.request.GET.get('shoespp', 2)

        context = super().get_context_data(**kwargs)

        return context


Смотрите также код во втором ответе на вопрос Как мне использовать пагинацию в общих ListViews на основе классов Django?

Вернуться на верх