मैंने Django का उपयोग करके एक फ़िल्टर फॉर्म बनाया है, जो पेजिनेटेड मैचों की एक सूची देता है।

जब मैं प्रारंभ में फ़िल्टर चलाता हूं, तो मुझे दिखाए जाने वाले पृष्ठों की सही संख्या मिलती है। हालांकि, जब मैं किसी अन्य पृष्ठ संख्या पर क्लिक करता हूं, तो पृष्ठ फ़िल्टर न किए गए परिणामों के लिए उस प्रासंगिक पृष्ठ संख्या पर वापस आ जाता है। उदाहरण के लिए, मैं 'बग' पर परिणामों को फ़िल्टर करता हूं और मुझे 'बग' प्रकार के टिकटों के लिए सभी पृष्ठांकित परिणाम मिलते हैं। पेजिनेशन विभिन्न पृष्ठों (1, 2, 3, आदि) और अगले और अंतिम बटन के लिंक दिखाता है। हालांकि, अगर मैं '3' पर क्लिक करता हूं, तो परिणाम अनफ़िल्टर्ड परिणामों पर वापस आ जाते हैं, मुझे फ़िल्टर किए गए परिणामों के पृष्ठ 3 के बजाय फ़िल्टर न किए गए परिणामों के पृष्ठ 3 के परिणाम और फ़िल्टर न किए गए परिणामों के लिए कुल पृष्ठों की संख्या दी जाती है। पेजिनेशन लिंक में दिखाएं।

क्या कोई मुझे यह समझने में मदद कर सकता है कि इस मुद्दे को कैसे ठीक किया जाए और पेजिनेशन के माध्यम से नेविगेट करते समय फ़िल्टर किए गए परिणामों को कैसे रखा जाए?

all_tickets.html:

// filter form code //

// Displayed results (unfiltered results displayed when page is first loaded) //

<!-- Pagination - only visible if there are multiple pages -->
{% if tickets.has_other_pages %}
    <ul class="pagination center-align">
        <!-- Previous/First button - only visible if previous page available -->
        {% if tickets.has_previous %}
            <!-- First page button -->
            <li>
                <a href="?page=1">
                    <i class="fas fa-angle-double-left" aria-hidden="true"></i>
                </a>
            </li>
            <!-- Previous page button -->
            <li>
                <a href="?page={{ tickets.previous_page_number }}">
                    <i class="fas fa-angle-left" aria-hidden="true"></i>
                </a>
            </li>
        {% endif %}

        <!-- Show link to current page and only few other surrounding pages, not all -->
        {% for num in tickets.paginator.page_range %}
            <!-- Show the current page number but disable it -->
            {% if tickets.number == num %}
                <li class="disabled">
                    <a>
                        {{ num }}
                    </a>
                </li>
            <!-- Show the 4 surrounding (2 next and 2 previous) pages -->
            {% elif num > tickets.number|add:'-3' and num < tickets.number|add:'3' %}
                <li>
                    <a href="?page={{ num }}">
                        {{ num }}
                    </a>
                </li>
            {% endif %}
        {% endfor %}

        <!-- Next/Last button - only visible if previous page available -->
        {% if tickets.has_next %}
            <!-- Next page button -->
            <li>
                <a href="?page={{ tickets.next_page_number }}">
                    <i class="fas fa-angle-right" aria-hidden="true"></i>
                </a>
            </li>
            <!-- Last page button -->
            <li>
                <a href="?page={{ tickets.paginator.num_pages }}">
                    <i class="fas fa-angle-double-right" aria-hidden="true"></i>
                </a>
            </li>
        {% endif %}

    </ul>
{% endif %}

views.py फ़ाइल में दृश्य खोजें:

def view_all_tickets(request):
    '''
    View all tickets
    Allows users to filter tickets based on type or status
    '''
    tickets = Ticket.objects.all()
    page = request.GET.get('page', 1)
    ticket_type_dropdown = TicketType.objects.all()
    ticket_status_dropdown = TicketStatus.objects.all()

    # Query parameters
    ticket_type = request.GET.get("ticket_type")
    ticket_status = request.GET.get("ticket_status")

    # Filter by query parameters
    if ticket_type:
        tickets = tickets.filter(ticket_type__id=ticket_type)
    else:
        tickets

    if ticket_status:
        tickets = tickets.filter(ticket_status__id=ticket_status)
    else:
        tickets

    # Pagination
    paginator = Paginator(tickets, 1)

    try:
        tickets = paginator.page(page)
    except PageNotAnInteger:
        tickets = paginator.page(1)
    except:
        tickets = paginator.page(paginator.num_pages)

    args = {
        "tickets": tickets,
        "ticket_type_dropdown": ticket_type_dropdown,
        "ticket_status_dropdown": ticket_status_dropdown,
    }

    return render(request, "all_tickets.html", args)
0
Sunny Hebbar 23 सितंबर 2019, 13:01

1 उत्तर

सबसे बढ़िया उत्तर

आपको प्रत्येक लिंक में सभी क्वेरी पैरामीटर शामिल करने होंगे। तो आपको उन्हें वापस टेम्पलेट में पास करना चाहिए और उन्हें पैरा में जोड़ना चाहिए:

args = {
    "tickets": tickets,
    "ticket_type_dropdown": ticket_type_dropdown,
    "ticket_status_dropdown": ticket_status_dropdown,
    "ticket_type": ticket_type,
    "ticket_status": ticket_status,
}

return render(request, "all_tickets.html", args)

...

<a href="?page={{ tickets.previous_page_number }}&ticket_type={{ ticket_type }}&ticket_status={{ ticket_status }}">
etc.

इसे आसान बनाने के लिए आप एक टेम्प्लेट फ़िल्टर को परिभाषित कर सकते हैं जो मौजूदा लिंक को स्वचालित रूप से आउटपुट करता है और आपको केवल पेज नंबर वेरिएबल को जोड़ने की अनुमति देता है, कुछ तृतीय-पक्ष पेजिनेशन लाइब्रेरी में शायद यह शामिल है।

0
Daniel Roseman 23 सितंबर 2019, 15:05