Dynamisch filter ListView CBV in Django 1.7
Ich habe gelesen, die offizielle Dokumentation auf dynamisch filtern ListView, aber ich bin immer noch verwirrt darüber, wie, es tatsächlich zu verwenden.
Momentan habe ich ein einfaches Modell, nennen wir es Scholarship
:
class Scholarship(models.Model):
title = models.CharField(max_length=255)
submitted_date = models.DateField(auto_now=True, verbose_name='Date Submitted')
EXPERIENCE_LEVEL_CHOICES = (
('A', 'Any'),
('S', 'Student'),
('G', 'Graduate')
)
experience_level = models.CharField(max_length=1, choices=EXPERIENCE_LEVEL_CHOICES, default='A')
Ich habe eine Seite, wo ich bin, mit allen Stipendien, mit ListView:
views.py
from django.views.generic import ListView
from .models import Scholarship
class ScholarshipDirectoryView(ListView):
model = Scholarship
template_name = 'scholarship-directory.html'
urls.py
from django.conf.urls import patterns, url
from .views import ScholarshipDirectoryView
urlpatterns = patterns('',
url(r'^$', ScholarshipDirectoryView.as_view(), name='scholarship_directory'),
)
Ich versuche, die links generieren, die auf der home-Seite der Website, die Rückkehr der gefilterten Versionen von dieser ListView. Zum Beispiel, wenn jemand klickt auf einen "show-Stipendien für graduate students" - link, nur für Stipendien experience_level='G'
angezeigt.
Habe ich kein problem wieder in dieser queryset über das shell -> Scholarship.objects.filter(experience_level__exact='G')
Ich bin nur unsicher, wie Sie dynamisch filtern der ListView per dropdown oder URL. Nicht auf der Suche nach ein plugin, sondern vielmehr verstehen, wie dynamisch Abfragen/filtern arbeitet in Django.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst alles, was Sie brauchen, um Ihre urls.py so dass es passieren die Erfahrung als parameter. So etwas wie dieses:
(die oben return 404, wenn /A oder /S oder /G nicht bestanden)
Nun, in
kwargs
Attribut des CBV wir haben eine kwarg namensexp
die verwendet werden können, durch dieget_queryset
Methode zum filtern von durch die Erfahrung Ebene.get_queryset
mitself.kwargs
.qs = super(...
hinzufügen `if 'exp' in sich selbst.kwargs: ... und zurück gefiltert qs wie oben, sonst nur zurück, qs. Dies macht es für die Arbeit mit oder ohne filter. Als ich versuchte, die Antwort, es funktionierte für Filterung, aber meine ursprünglichen ungefilterten Blick war gebrochen.