Django передает контекст в другое представление из диспетчеризации
Я хочу перенаправлять пользователей в ListView или DetailView на основе их роли через SiteDispatchView. Если DetailView, то я хочу передать request.user.site в DetailView, но сталкиваюсь с проблемой: AttributeError: Generic detail view SiteDetailView must be called with either an object pk or a slug in the URLconf.
Мой URL для DetailView имеет вид path('<int:pk>/', SiteDetailView.as_view(), name='detail-site'),
(Обратите внимание, что site является полем OnetoOneField с моделями Site и User.)
# 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 в обоих классах:
return reverse("project_site:detail-site", args=(request.user.site.id,))
РЕДАКТИРОВАНИЕ:
В качестве совета, при работе с классами следует использовать reverse_lazy() вместо reverse().
https://docs.djangoproject.com/en/dev/ref/urlresolvers/#reverse-lazy