如何将url中的变量传递给Django List View

时间:2018-10-18 09:35:31

标签: python django django-views

我有一个Django通用列表视图,我想根据输入到URL中的值进行过滤。 例如,当有人输入mysite.com/defaults/41时,我希望视图过滤所有匹配41的值。 我通过基于功能的视图实现了几种方法,但是没有基于类的Django视图。

我尝试过:

views.py

class DefaultsListView(LoginRequiredMixin,ListView):
    model = models.DefaultDMLSProcessParams
    template_name = 'defaults_list.html'
    login_url = 'login'
    def get_queryset(self):
        return models.DefaultDMLSProcessParams.objects.filter(device=self.kwargs[device])

urls.py

path('<int:device>', DefaultsListView.as_view(), name='Default_Listview'),

1 个答案:

答案 0 :(得分:2)

您接近了,self.kwargs是一个字典,将 strings 映射到从URL提取的相应值,因此您需要在此处使用包含'device'的字符串:

class DefaultsListView(LoginRequiredMixin,ListView):
    model = models.DefaultDMLSProcessParams
    template_name = 'defaults_list.html'
    login_url = 'login'

    def get_queryset(self):
        return models.DefaultDMLSProcessParams.objects.filter(
            device_id=self.kwargs['device']
        )

在这里使用devide_id可能更好,因为在语法上我们很清楚地将标识符与标识符进行比较。

进行super()调用也可能更“惯用”,这样,如果您以后添加mixins,它们可以“预处理” get_queryset调用:

class DefaultsListView(LoginRequiredMixin,ListView):
    model = models.DefaultDMLSProcessParams
    template_name = 'defaults_list.html'
    login_url = 'login'

    def get_queryset(self):
        return super(DefaultsListView, self).get_queryset().filter(
            device_id=self.kwargs['device']
        )