在Django 1.7中动态过滤ListView CBV

发布于 2021-01-29 16:05:52

我已经阅读了有关动态过滤ListView的官方文档,但是对于如何实际使用它仍然感到困惑。

我目前有一个简单的模型,我们称之为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显示所有这些奖学金:

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'),
)

我正在尝试在网站的主页上生成链接,这些链接将返回此ListView的筛选后的版本。例如,如果某人单击“显示研究生奖学金”链接,则仅experience_level='G'显示具有的奖学金。

我没有问题通过外壳返回此查询集-> Scholarship.objects.filter(experience_level__exact='G')

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

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

    (如果未通过/ A或/ S或/ G,则上面的代码将返回404)

    现在,在 kwargsCBV的属性中,我们将有一个名为kwarg的名称exp,该get_queryset方法可用于根据经验水平进行过滤。

    class ScholarshipDirectoryView(ListView):
        模式=奖学金
        template_name ='scholarship-directory.html'
    
        def get_queryset(self):
            qs =超级(ScholarshipDirectoryView,self).get_queryset()
            返回qs.filter(experience_level__exact = self.kwargs ['exp'])
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看