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
我想通过 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:
中将此参数添加到您的 returnreturn 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