首页 > 解决方案 > 将请求重定向到正确的视图

问题描述

Django==2.2.2

网址模式:

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

我的网址:

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

问题: 这个 url 指向 CampaignsListView 而不是 CampaignsDetailView。如何将此请求定向到 CampaignsDetailView?

标签: django

解决方案


?ids=44174865,44151214,44049374部分不是URL路径的一部分,而是查询字符串[wiki]的一部分。您不能根据查询字符串定向到不同的视图。查询字符串的内容被处理成request.GET[Django-doc],一个类似字典的对象。

因此,您应该在视图本身中处理此问题。例如,您可以在给定ids值的情况下过滤列表视图:

class CampaignsListView(ListView):

    # ...

    def get_queryset(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 get(self, request, *args, **kwargs):
        if 'ids' in request.GET:
            return CampaignsDetailView.as_view()(request, *args, **kwargs)
        return super().get(request, *args, **kwargs)

虽然看起来有点“”。


推荐阅读