Разрешить пользователям сортировать в порядке возрастания с помощью радиокнопки django

У меня есть веб-страница, как показано ниже, веб-страница может отображать данные в виде таблицы, я также реализовал строку поиска и фильтр страницы и оба работают, сейчас я пытаюсь позволить пользователям сортировать данные в порядке возрастания. Например, имя клиента будет начинаться от A (Airasia) до Z (Zasia), а номер детали будет начинаться от 1 (01232) до 9 (999). Как мне это сделать, и в то же время, когда данные сортируются в порядке возрастания, строка поиска и страницы фильтра также работают.

enter image description here views.py

@login_required()
def ViewMCO(request):
    search_post = request.GET.get('q')
    if (search_post is not None) and search_post:
        allusername = Photo.objects.filter(Q(reception__icontains=search_post) | Q(partno__icontains=search_post) | Q(
            Customername__icontains=search_post) | Q(mcoNum__icontains=search_post) | Q(status__icontains=search_post)
                                           | Q(serialno__icontains=search_post))
        if not allusername:
            allusername = Photo.objects.all().order_by("-Datetime")

    else:
        allusername = Photo.objects.all().order_by("-Datetime")

    page = request.GET.get('page')
    paginator = Paginator(allusername, 6)
    try:
        allusername = paginator.page(page)
    except PageNotAnInteger:
        allusername = paginator.page(1)
    except EmptyPage:
        allusername = paginator.page(paginator.num_pages)

    context = {'allusername': allusername, 'query': search_post}
    return render(request, 'ViewMCO.html', context)

ViewMCO.html

В вашем views.py есть некоторая логическая проблема, потому что если пользователь пытается отсортировать ваши данные
. по несуществующим полям, у вас возникнет 500 ошибка. Я устранил эту ошибку, сделав следующее.
views.py

@login_required()
def ViewMCO(request):
    search_post = request.GET.get('q')
    if (search_post is not None) and search_post:
        allusername = Photo.objects.filter(Q(reception__icontains=search_post) | Q(partno__icontains=search_post) | Q(
            Customername__icontains=search_post) | Q(mcoNum__icontains=search_post) | Q(status__icontains=search_post)
                                           | Q(serialno__icontains=search_post))
        if not allusername:
            allusername = Photo.objects.all().order_by("-Datetime")


    else:
        allusername = Photo.objects.all().order_by("-Datetime")

    #new important part   
    part = request.GET.get('sortType')
    valid_sort = ["partno","serialno","receptionno","Customername","mcoNum"]
    if (part is not None) and part in valid_sort:
        allusername = allusername.order_by(part)

    page = request.GET.get('page')
    paginator = Paginator(allusername, 6)
    try:
        allusername = paginator.page(page)
    except PageNotAnInteger:
        allusername = paginator.page(1)
    except EmptyPage:
        allusername = paginator.page(paginator.num_pages)

    context = {'allusername': allusername, 'query': search_post,'order_by':part}
    return render(request, 'ViewMCO.html', context)

html
. в сортировке по есть некоторые изменения, которые нужно сделать. я изменил значение на value='{{ request.GET.sortType }}' и также я поставил action="" это означает, что используется текущий url.

<div class="sort">
           <h5 class="col-md-3">Sort By : </h5>


                <div id="sortBlock" class="col-md-9">
                    <form class="form-inline my-2 my-lg-0" action="" method='GET' value='{{ request.GET.sortType }}'>
                   
                    <div class="sort">
                        <input type="radio" id="partno" name="sortType" value="partno">
                        <label for="partno">Part Number</label>
                    </div>

                     <div class="sort">
                        <input type="radio" id="serialno" name="sortType" value="serialno">
                        <label for="serialno">Serial Number</label>
                    </div>

                     <div class="sort">
                        <input type="radio" id="receptionno" name="sortType" value="receptionno">
                        <label for="receptionno">Reception Number</label>
                    </div>

                    <div class="sort">
                        <input type="radio" id="mcoNum" name="sortType" value="mcoNum">
                        <label for="mcoNum">MCO Number</label>
                    </div>

                    <div class="sort">
                        <input type="radio" id="Customername" name="sortType" value="Customername">
                        <label for="Customername">Customer Name</label>
                    </div>
                         <div class="sort">
                        <input type="Submit" value="Sort"/>
                    </div>
                    </form>
                </div>
         </div>

теперь нам нужно поработать над пагинацией (мы должны добавить order_by к части пагинации)

{% if allusername.has_other_pages %}

  <ul class="pagination pr-3 mr-1 ml-auto">

    {% if allusername.has_previous %}
      <li><a href="?q={{ query|urlencode }}&sortType={{ order_by }}&page={{ allusername.previous_page_number }}">&laquo;</a></li>
    {% else %}
      <li class="disabled"><span>&laquo;</span></li>
    {% endif %}
    {% for i in allusername.paginator.page_range %}
      {% if allusername.number == i %}
        <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li>
      {% else %}
        <li><a href="?q={{ query|urlencode }}&sortType={{ order_by }}&page={{ i }}">{{ i }}</a></li>
      {% endif %}
    {% endfor %}
    {% if allusername.has_next %}
      <li><a href="?q={{ query|urlencode }}&sortType={{ order_by }}&page={{ allusername.next_page_number }}">&raquo;</a></li>
    {% else %}
      <li class="disabled"><span>&raquo;</span></li>
    {% endif %}
    </ul>
    {% endif %}

Думаю, это все, что вам нужно. Если у вас есть вопросы, задайте их в комментариях ниже.

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