Wie erfolgt die Nachbearbeitung vor dem Rendern mit django endless-pagination?

8

Ich versuche herauszufinden, ob es möglich ist, die Nachbearbeitung meines Anfrage-Sets zu betrachten, bevor ich es in eine Django-Vorlage rendere, die django-endlose-Paginierung für unendliches Scrollen verwendet.

Ich habe eine sichtspezifische Logik, die bestimmte Ergebnisse aus dem Abfrage-Set basierend auf dem Kontext auslässt und Attribute zu den Objekten in der Liste hinzufügt, die von den Vorlagen verwendet werden. Diese Logik kann nicht über SQL ausgeführt werden, da sie dem Modell nicht innewohnt. Es muss in Python gemacht werden.

Bei der Django-Paginierung und anderen vorgerollten Django-Paginierungsmodulen scheint die ganze Logik durch Templatetags ausgeführt zu werden, was verhindert, dass Geschäftslogik vor der Rendering-Phase ausgeführt werden kann (was ein Django-Lehrsatz ist). p>

Da meine View-Logik die Ergebnismenge durchläuft, bevor die Template-Tags ausgeführt werden, verliere ich die Optimierungen, die von diesem Modul angeboten werden (wie SQL-Abfragen mit Paging, z. B. Limit 20; Offset 20). Mein Code durchläuft bei jedem Seitenaufruf die gesamte unpagete Ergebnisliste und umgeht dabei die durch das Template-Tag gebotene Lazy-Paginierung.

Kurz bevor ich meinen Code direkt in das Paginierungsmodul verschiebe (was ich lieber nicht tun würde und eine Menge zusätzlicher Daten in den Anfragekontext für die Verwendung in einem Tag einfügen müsste), gibt es eine Alternative?

Danke!

    
randalv 09.09.2013, 18:18
quelle

1 Antwort

5

Wenn Sie lazy_paginate Tags verwenden < Eine href="https://github.com/frankban/django-endless-pagination/blob/master/endless_pagination/paginators.py#L79"> LazyPaginator -Klasse, um das Abfrage-Set zu verarbeiten. Sie können diese Klasse überschreiben, um Ihren Zweck zu erfüllen. Um dies zu tun, müssen Sie Custom Template Tag schreiben. Weitere Anweisungen in den Code-Kommentaren.

* my_app / templatetags / custom_pagination_tags.py *

%Vor%

Laden Sie in Template Ihre benutzerdefinierten Vorlagen-Tags und verwenden Sie stattdessen diese:

%Vor%

Schwierig: Erster Zugriff auf den Kontext der Anfrage in der CustomLazyPaginator-Klasse

Ja, es gibt eine Möglichkeit, den Anfragekontext zu übergeben, aber dafür müssen Sie das paginate -Tag und auch die render -Methode von PaginateNode überschreiben, wie Sie sehen können hier wenn es paginator_class aufruft, gibt es keine Kontextinformationen weiter. Unten sind die Schritte, um das zu erreichen:

Fügen Sie die Methode __init__ in CustomLazyPaginator hinzu:

%Vor%

Kopieren Sie das paginate -Tag und ändern Sie die return -Anweisung von PaginateNode(paginator_class, objects, **kwargs) in CustomPaginateNode(paginator_class, objects, **kwargs) , wir schreiben CustomPaginateNode unten.

%Vor%

Entfernen Sie den folgenden Import, den wir zuvor aufgerufen haben, um den Aufruf von original paginate function:

zu vermeiden %Vor%

Überschreibe die render -Methode von PaginateNode , um den Kontext an unsere CustomLazyPaginator -Klasse zu übergeben:

%Vor%

Einfach: Zweiter Ansatz für den Zugriff auf den Kontext in der CustomLazyPaginator-Klasse

Installieren Sie einfach django-contrib-requestprovider und fügen Sie ihn in der Middleware in djangos settings.py und dem Zugriff hinzu aktuelle Anfrage, wo Sie wollen als:

%Vor%     
Aamir Adnan 20.11.2013, 01:43
quelle