Django 将上下文从调度传递到另一个视图

Django pass context into another view from dispatch

我想通过 SiteDispatchView 根据用户的角色将用户重定向到 ListView 或 DetailView。如果是DetailView,我想把request.user.site传入DetailView,但是遇到:AttributeError: Generic detail view SiteDetailView must be called with either an object pk or a slug in the URLconf.

我的 DetailView URL 是 path('<int:pk>/', SiteDetailView.as_view(), name='detail-site'),

(请注意,站点是具有站点和用户模型的 OnetoOneField。)

# views.py
class SiteDispatchView(LoginRequiredMixin, View):
    def dispatch(self, request, *args, **kwargs):
        if request.user.role >= 2:
            return SiteDetailView.as_view()(request, self.request.user.site)
        else:
            return SiteListView.as_view()(request)

class SiteDetailView(LoginRequiredMixin, generic.DetailView):
    template_name = "project_site/site_detail.html"
    context_object_name = "project_sites"
    model = Site

    def get_success_url(self):
        return reverse("project_site:detail-site")

问题是您的 SiteDetailView class 需要参数 int:pk。因此,您必须在 classes:

中将此参数添加到您的 return
return reverse("project_site:detail-site", args=(request.user.site.id,))

编辑:

作为提示,在使用 [=26 时,您应该使用 reverse_lazy() 而不是 reverse() =]es.

https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy