Вложенные модели Django в представлениях на основе классов - PullRequest
0 голосов
/ 03 апреля 2019

Я относительно новичок в python / django и не уверен, что все делаю правильно

Предположим, есть 2 разных приложения projects и items.URL, который у меня есть в приложении items:

path('projects/<slug:project_slug>/items/', ItemListView.as_view())

И просмотр cb:

class ItemListView(CanViewProjectMixin, ListView):
    model = Item

    def get(self, request, *args, **kwargs):
        self.project = Project.objects.get(slug=kwargs.get('project_slug'))
        return super(ItemListView, self).get(request, *args, **kwargs)

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super(ItemListView, self).get_context_data(**kwargs)
        context['project'] = self.project
        return context

Кажется, что это хорошо работает в представлениии он передает объект project в шаблон через context

Однако я не могу получить self.project в методе CanViewProjectMixin.dispatch().

Любая помощьприветствуется

Обновление

CanViewProjectMixin имеет метод get_permission_object(), который извлекает объект project в основных представлениях приложения проекта, где извлекается projectпо умолчанию get_object() или через self.project, где представление является дочерним для project, как в примере выше.

def get_permission_object(self):
    if hasattr(self, 'project'):
        return self.project
    return (hasattr(self, 'get_object') and self.get_object() or
            getattr(self, 'object', None))

def dispatch(self, request, *args, **kwargs):
    self.object = self.get_permission_object()
    ...
    # do stuff with the object and return super()

В представлениях проекта, где project извлекается через get_object(), оно работаетпросто отлично, проблема только в дочерних взглядах

1 Ответ

1 голос
/ 03 апреля 2019

Недавно выпущенный Django 2.2 включает новый метод setup, который вызывается представлением перед вызовом dispatch.Это лучшее место для инициализации новых переменных экземпляра вида, таких как self.project, без необходимости переопределять dispatch.

class ItemListView(CanViewProjectMixin, ListView):
model = Item

def setup(self, request, *args, **kwargs):
    super().setup(request, *args, **kwargs)
    self.project = Project.objects.get(slug=kwargs.get('project_slug'))

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['project'] = self.project
    return context

Как указывают документы , вы всегда должны вызывать super() при переопределении setup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...