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

Вернуться на верх