Um die Benutzerfreundlichkeit der Artikelabschnitte zu verbessern, wurde eine Sortierung der Artikel nach Datum, Titel und Anzahl der Aufrufe eingeführt. Außerdem wurde die Möglichkeit hinzugefügt, nach Informationen zu den Artikeln der Rubrik zu suchen. Realisiert wird dieses Feature durch mehrere Checkboxen, die die Namen der zu sortierenden Spalten an die Seiten-URL anhängen bzw. die Seite neu lädt.
Beispielsweise gibt es mehrere Spalten im Datenmodell
- Titel
- pub_date
- Ansichten
Wir werden danach sortieren, was in der üblichen Version der Abfrage so aussehen würde
Article.objects.all().order_by('title', 'pub_date', 'views')
Da wir jedoch Kontrollkästchen verwenden, können Sortieroptionen vorhanden sein oder nicht. Aber werden wir nicht if else Blöcke für jede Kombination von Checkboxen schreiben? Natürlich nicht.
Lassen Sie uns zuerst sehen, wie ein Formular geschrieben werden kann, um die Sortierung zu implementieren. Ich werde sofort reservieren, dass ich eine Version des Formulars ohne Styling gebe, das auf meiner Website verwendet wird. Tatsache ist, dass dafür Bootstrap 4 Material Design verwendet wird, was die Layout-Option etwas verkompliziert und dem Beispiel eine Reihe zusätzlicher Elemente hinzufügt.
<form method="get"> <button type="submit" class="btn btn-sm btn-primary btn-raised mr-3">{% trans 'Сортировать' %}</button> <input name="sort" type="checkbox" value="title" {{ by_title }}>{% trans "по заголовку" %} <input name="sort" type="checkbox" value="pub_date" {{ by_date }}>{% trans "по дате" %} <input name="sort" type="checkbox" value="views" {{ by_views }}>{% trans "по просмотрам" %} </form>
Wie Sie sehen können, haben alle Kontrollkästchen im Code den Namen sort, und der Wert value entspricht dem Namen der Spalte, nach der die Sortierung aktiviert werden kann.
Daher erscheinen die folgenden Argumente in der URL
?sort=title&sort=pub_date&sort=views
Mit Django können Sie alle Argumente aus einer Anfrage als Liste extrahieren, die wir zum Sortieren an die Methode order_by übergeben können.
Und die tatsächliche Rendering-Ansicht für den Artikelabschnitt könnte so aussehen:
class SectionView(View): def get(self, request, slug): section = get_object_or_404(Section, slug=slug) sort = request.GET.getlist('sort') articles = section.article_set.all().order_by(*sort) return render( request=request, template_name='knowledge/section.html', context={ 'section': section, 'articles': articles } )
Bitte beachten Sie, dass anstelle der Methode get die Methode getlist verwendet wird, die eine Liste von Argumentwerten zurückgibt, wenn derselbe Argumentname mehrmals in der Anfrage vorkam.
sort = request.GET.getlist('sort')
Und dann übergeben wir die Liste mit dem Zeiger als Argumente an die Methode order_by
articles = section.article_set.all().order_by(*sort)
Für Django empfehle ich Timeweb-Hoster VDS-Server .
Ну. Массово пока не использую фильтрации, поэтому не искал батареек. Так получилось, что даже не знал про django-filters.
хорошие статьи я много чего нашел тут интересного и нового... мне нравиться!
если вдруг интересно будет по фильтрам вот примерный код)
Спасибо за пример кода.
Когда буду внедрять больше поисковых виджетов на сайт, в первую очередь воспользуюсь вашим примером кода. Благо уже есть некоторые целевые места, где это можно применить.