Как отфильтровать вывод ListView на основе идентификатора из текущего URL - PullRequest
0 голосов
/ 16 апреля 2020

Мой проект список покупок. У меня есть две модели: ShoppingList и ShoppingItem, как это:

models.py

class ShoppingItem (Model):
    name = models.CharField(max_length=50, null=False)
    count = models.IntegerField(null=False)
    list = models.ForeignKey(ShoppingList, on_delete=models.CASCADE, related_name='shopping_items')
    date_created = models.DateTimeField(auto_now_add=True)

urls.py

urlpatterns = [
    path('ListDetails/<int:pk>', views.ListDetailUpdateView.as_view(), name='listdetailupdate'),
]

views.py

class ListDetailUpdateView(ListView):
    model = ShoppingItem
    template_name = 'xlist_app/ListDetailUpdateView.html'
    context_object_name = 'products'
    queryset = ShoppingItem.objects.filter(list = XXXX)

Мне нужна функция, которая возвращает часть URL, но внутри ListView (где "XXXX")

Моя идея состоит в том, чтобы вырезать последнюю часть URL (например, когда я вхожу в список № 2, у меня есть адрес http://127.0.0.1:8000/ListDetails/2 ) и замените «XXXX» такой функцией.

На мой взгляд, это должно выглядеть следующим образом:

queryset = ShoppingItem.objects.filter(list = int(request.path.split('/')[-1])

, если есть лучший способ сделать это, я буду благодарен всем предложениям

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Переопределение get_queryset метод - это путь к go.

Вызов super() возвращает набор запросов, возвращаемый родительским методом. Фильтрация по нему должна работать просто отлично. pk, соответствующий шаблону URL, будет доступен в self.kwargs.

class ListDetailUpdateView(ListView):
    model = ShoppingItem
    template_name = 'xlist_app/ListDetailUpdateView.html'
    context_object_name = 'products'

    def get_queryset(self):
        qs = super(ListDetailUpdateView, self).get_queryset()
        return qs.filter(list=self.kwargs.get('pk'))

Я бы также рассмотрел вопрос об изменении list имени поля на shopping_list или аналогичное, поскольку оно затеняет встроенный -in list() функция.

0 голосов
/ 16 апреля 2020

Нечто подобное

class ListDetailUpdateView(ListView):
    model = ShoppingItem
    template_name = 'xlist_app/ListDetailUpdateView.html'
    context_object_name = 'products'

    def get_queryset(self):
       return ShoppingItem.objects.filter(list=self.request.resolver_match.kwargs['pk'])
...