Django将上下文从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类需要一个参数int:pk。因此,您必须在两个类的返回中添加此参数:

return reverse("project_site:detail-site", args=(request.user.site.id,))

编辑:

作为提示,在处理类时,应该使用reverse_lazy((,而不是reverse((

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

最新更新