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)
Вернуться на верх