Django сортировка объектов с помощью Dropdown-List / параметра url
У меня проблемы с сортировкой объектов из базы данных в основном шаблоне, которые основаны на параметрах url. Я хочу сортировать объекты по разным параметрам. В основном по дате, цене и т.д. У меня есть форма в шаблоне, функция views.py, где я пытаюсь получить параметр "sort=new". Если я использую чекбоксы или радио, то все работает. Но мне нужно отсортировать объекты с select и option. Мой шаблон:
<h2>Number of adverts: {{num}}</h2>
<form action="{% url 'adverts' %}">
<span>Sort by:</span>
<select name="sort">
<option value="new">newest</option>
<option value="old">older</option>
<option value="price_low">price low</option>
<option value="price_high">price high</option>
<option value="mileage_low">mileage lowest</option>
<option value="mileage_high">mileage higher</option>
<input type="submit" value="Sort">
</select>
</form>
Моя функция views.py:
def adverts(request):
page = 'adverts'
if request.GET.get('sort', 'new'):
adverts = Advert.objects.all().order_by('-created')
elif request.GET.get('sort','old'):
adverts = Advert.objects.all().order_by('created')
else:
adverts = Advert.objects.all().order_by('-mileage')
a = 0
for num in adverts:
a += 1
context = {'adverts': adverts, 'num': a, 'page': page}
return render(request, 'adverts/adverts.html', context)
Как я уже упоминал выше. Я хочу сортировать объекты, которые я печатаю в своем шаблоне. Я хочу, чтобы это был выпадающий список, а не чекбокс или радио. Может быть, мне нужно создать форму в файле forms.py, а затем получить доступ к полям формы в моем шаблоне? Я запутался.
Вы должны проверить значение параметра sort
, так:
def adverts(request):
page = 'adverts'
adverts = Advert.objects.all()
sort_by = request.GET.get('sort') # 🖘 obtain the value for sort
if sort_by == 'new':
adverts = adverts.order_by('-created')
elif sort_by == 'old':
adverts = adverts.order_by('created')
else:
adverts = adverts.order_by('-mileage')
num = len(adverts) # 🖘 use len to count the number of items
context = {'adverts': adverts, 'num': num, 'page': page}
return render(request, 'adverts/adverts.html', context)