Django ordenando objetos con lista desplegable/parámetro url

Tengo problemas con la clasificación de objetos de la base de datos en la plantilla principal que se basan en parámetros de URL. Quiero ordenar objetos de diferentes maneras. Principalmente por fecha, precio, etc. Tengo mi formulario en plantilla, mi función views.py donde intento obtener el parámetro "sort=new". Si estoy usando casillas de verificación o radio, entonces todo funciona. Pero necesito ordenar objetos con selección y opción. Mi plantilla:

<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>

Mi función 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)

Como menciono arriba. Quiero ordenar los objetos que estoy imprimiendo en mi plantilla. Quiero que sea una lista desplegable, no una casilla de verificación o radio. ¿Tal vez necesito crear un formulario en el archivo forms.py y luego obtener acceso a los campos de formulario en mi plantilla? Estoy confundido.

Answer

Debe verificar el valor del sortparámetro, entonces:

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)