Как передать переменную в URL в Django List View - PullRequest
0 голосов
/ 18 октября 2018

У меня есть общий вид списка 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 голосов
/ 18 октября 2018

Вы близки, self.kwargs - это словарь, который отображает строки на соответствующее значение, извлеченное из 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<b>_id</b>=self.kwargs[<b>'device'</b>]
        )

Вероятно, лучше использовать devide_id здесь, поскольку тогда синтаксически ясно, что мы сравниваем идентификаторы с идентификаторами.

Это также может быть более "идиоматическим" длясделать вызов super(), так что если вы позже добавите миксины, они могут «предварительно обработать» вызов 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)<b>.get_queryset()</b>.filter(
            device_id=self.kwargs['device']
        )
...