我想通过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-惰性