Перенаправить запрос на правильный вид - PullRequest
1 голос
/ 23 июня 2019

Джанго == 2.2.2

Urlpattenrs:

urlpatterns = [
    re_path(r'^campaigns/$', CampaignsListView.as_view(), name="campaigns_list"),
    re_path(r'^campaigns/(?P<ids>\w+)/$', CampaignsDetailView.as_view(), name="campaigns_detail"),
]

Мой URL:

http://localhost:8000/campaigns/?ids=44174865,44151214,44049374

Проблема: Этот URL ведет к CampaignsListView, а не к CampaignsDetailView. Не могли бы вы помочь мне направить этот запрос в CampaignsDetailView?

1 Ответ

1 голос
/ 23 июня 2019

Часть ?ids=44174865,44151214,44049374 - это , а не часть пути URL-адреса, но строка запроса [wiki] .Вы не можете перейти к другому представлению, основанному на строке запроса.Содержимое строки запроса обрабатывается в request.GET [Django-doc] , похожем на словарь объект.

Таким образом, вы должны обработать это в самом представлении,Например, вы можете отфильтровать представление списка, если есть значения ids:

class CampaignsListView(ListView):

    # ...

    def <b>get_queryset</b>(self):
        qs = super().get_queryset()
        ids = request.GET.get('ids')
        if ids:
            try:
                return qs.filter(id__in=map(int, ids.split(',')))
            except ValueError:
                return qs
        return qs

Или вы можете проверить, содержит ли URL набор запросов, и затем позволить CampaignsDetailView выполнить работу, например:

class CampaignsListView(ListView):

    # ...

    def <b>get</b>(self, request, *args, **kwargs):
        if <b>'ids' in request.GET</b>:
            return CampaignsDetailView.as_view()(request, *args, **kwargs)
        return super().get(request, *args, **kwargs)

Хотя выглядит немного " некрасиво ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...