gpt4 book ai didi

python - 在 Django 1.7 中动态过滤 ListView CBV

转载 作者:太空狗 更新时间:2023-10-29 18:01:32 24 4
gpt4 key购买 nike

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

我目前有一个简单的模型,我们称之为奖学金:

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' 的奖学金。

我通过 shell 返回这个查询集没问题 -> Scholarship.objects.filter(experience_level__exact='G')

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

最佳答案

首先,您需要更改 urls.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'])

关于python - 在 Django 1.7 中动态过滤 ListView CBV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25662374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com