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>« 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 » </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?