#html #django #django-views #django-templates
Вопрос:
У меня есть веб-страница, как показано ниже, поэтому, когда я нажимаю на любой 1 из моих переключателей, мой URL-адрес покажет, что я нажал, но моя таблица данных не будет сортироваться в порядке возрастания в соответствии с тем, что я выбрал, как мне исправить эту проблему и как сделать так, чтобы при использовании строки поиска и фильтрации страницы она все равно сортировалась в порядке возрастания?
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") # The newest submitted log data will appear at the top 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
{% extends "customerbase.html" %} {% block content %} <style> table { border-collapse:separate; border:solid black 1px; border-radius:6px; -moz-border-radius:6px; } td, th { border-left:solid black 1px; border-top:solid black 1px; } th { border-top: none; } td:first-child, th:first-child { border-left: none; } .pagination a { padding: 10px; } .sort { display: inline; margin: 0 20px 0 20px; } </style> <script> // Function to download table data into csv file function download_table_as_csv(table_id, separator = ',') { var rows = document.querySelectorAll('table#' table_id ' tr'); var csv = []; for (var i = 0; i < rows.length; i ) { var row = [], cols = rows[i].querySelectorAll('td, th'); for (var j = 0; j < cols.length; j ) { var data = cols[j].innerText.replace(/(rn|n|r)/gm, '').replace(/(ss)/gm, ' ') data = data.replace(/"/g, '""'); row.push('"' data '"'); } csv.push(row.join(separator)); } var csv_string = csv.join('n'); var filename = 'export_' table_id '_' new Date().toLocaleDateString() '.csv'; var link = document.createElement('a'); link.style.display = 'none'; link.setAttribute('target', '_blank'); link.setAttribute('href', 'data:text/csv;charset=utf-8,' encodeURIComponent(csv_string)); link.setAttribute('download', filename); document.body.appendChild(link); link.click(); document.body.removeChild(link); }; </script> <div style="padding-left:16px"> <br> <div class="form-block"> <h6>Search for Part Number/ Serial Number/ Reception Number/ MCO Number/ Customer Name/ Status</h6> <form class="form-inline my-2 my-lg-0" action="{% url 'ViewMCO' %}" method='GET' value='{{ request.GET.q }}'> <input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search" name="q" value='{{ request.GET.q }}'/> <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button> </form> <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="{% url 'ViewMCO' %}" method='GET' value='{{ request.GET.p }}'> <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> </div> <table id="viewTable" class="m-2"> <i class="fa fa-download" aria-hidden="true"></i> <a href="#" onclick="download_table_as_csv('viewTable');">Download as CSV</a> <br> <tr class="header"> <th>Latest Log</th> <th>Part Number</th> <th>Serial Number</th> <th>Reception Number</th> <th>MCO Number</th> <th>Customer Name</th> <th>Status</th> <th>Action</th> </tr> {% for photo in allusername %} <tr> <td>{{photo.Datetime}}</td> <td>{{photo.partno}}</td> <td>{{photo.serialno}}</td> <td>{{photo.reception}}</td> <td>{{photo.mcoNum}}</td> <td>{{photo.Customername}}</td> <td>{{photo.status}}</td> <td> <form action="{% url 'customerdetails' photo.id %}" method="post"> {% csrf_token %} <button type="submit" class="btn btn-sm btn-info">View</button> </form> </td> </tr> {% endfor %} </table> <br> {% if allusername.has_other_pages %} <ul class="pagination pr-3 mr-1 ml-auto"> {% if allusername.has_previous %} <li><a href="?q={{ query|urlencode }}amp;page={{ allusername.previous_page_number }}">amp;laquo;</a></li> {% else %} <li class="disabled"><span>amp;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 }}amp;page={{ i }}">{{ i }}</a></li> {% endif %} {% endfor %} {% if allusername.has_next %} <li><a href="?q={{ query|urlencode }}amp;page={{ allusername.next_page_number }}">amp;raquo;</a></li> {% else %} <li class="disabled"><span>amp;raquo;</span></li> {% endif %} </ul> {% endif %} </div> {% endblock %}
Ответ №1:
Если вы хотите отсортировать данные queryset, это должно быть реализовано, как показано ниже. Если вы хотите добавить сортировку по убыванию или по возрастанию, то вы можете сделать это с помощью параметра order_by, передающего » — «по убыванию, пустую строку по возрастанию, например «- id «по убыванию,» id » по возрастанию.
@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") # The newest submitted log data will appear at the top # example code starts sort_type = request.GET.get('sortType') allusername = allusername.order_by(sort_type) # example code ends 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)