动态过滤Django 1.7中的ListView CBV

2024-05-16 08:38:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我读过official documentation on dynamically filteringListView,但仍然对如何实际使用它感到困惑。

我现在有一个简单的模型,我们称之为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')

我有一个页面显示了所有这些奖学金,使用ListView:

视图.py

from django.views.generic import ListView
from .models import Scholarship


class ScholarshipDirectoryView(ListView):
    model = Scholarship
    template_name = 'scholarship-directory.html'

url.py

from django.conf.urls import patterns, url

from .views import ScholarshipDirectoryView

urlpatterns = patterns('',
    url(r'^$', ScholarshipDirectoryView.as_view(), name='scholarship_directory'),
)

我正在尝试在网站主页上生成链接,以返回此ListView的筛选版本。例如,如果有人点击“显示研究生奖学金”链接,则只显示带experience_level='G'的奖学金。

我可以通过shell返回这个queryset->;Scholarship.objects.filter(experience_level__exact='G')

我只是不确定如何通过下拉列表或URL动态过滤ListView。不是想使用插件,而是想了解动态查询/过滤在Django中是如何工作的。


Tags: namefromimporturlmodelslevellengthmax
1条回答
网友
1楼 · 发布于 2024-05-16 08:38:53

首先,您需要更改url.py,以便它将体验作为参数传递。像这样的:

urlpatterns = patterns('',
    url(r'^(?P<exp>[ASG])$', ScholarshipDirectoryView.as_view(), name='scholarship_directory'),
)

(如果/A或/S或/G未通过,则上述返回404)

现在,在CBV的kwargs属性中,我们将有一个名为exp的kwarg,它可以被get_queryset方法用于按经验级别筛选。

class ScholarshipDirectoryView(ListView):
    model = Scholarship
    template_name = 'scholarship-directory.html'

    def get_queryset(self):
        qs = super(ScholarshipDirectoryView, self).get_queryset()
        return qs.filter(experience_level__exact=self.kwargs['exp'])

相关问题 更多 >