Доступ к объекту контекста в универсальном представлении на основе классов Django - PullRequest
5 голосов
/ 28 апреля 2011

Я использую DetailView для просмотра объекта Project, и я хотел бы иметь возможность получить доступ к просматриваемому объекту Project, чтобы передать его декоратору, что-то вроде этого:

class ProjectDetailView(DetailView):
    context_object_name = "project"
    model = Project

    @method_decorator(membership_required(project))
    def dispatch(self, *args, **kwargs):
        return super(ProjectDetailView, self).dispatch(*args, **kwargs)

Однако передача «проекта» или «объекта» декоратору дает мне «объект», а не экземпляр проекта.Как я могу получить этот экземпляр Project, чтобы моя функция декоратора могла с ним работать?

1 Ответ

8 голосов
/ 28 апреля 2011

Объект извлекается внутри метода dispatch (), поэтому ваш декоратор не может его использовать. Вы можете проверить членство внутри переопределенного метода get ():

class ProjectDetailView(DetailView):
    context_object_name = "project"
    model = Project

    def get(self, request, **kwargs):
        self.object = self.get_object()
        if not self.object.is_member(self.request.user):
            return HttpResponseRedirect('/') # or something else
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)

Если вы хотите придерживаться декоратора, вам придется извлечь объект из базы данных в вашем декораторе на основе аргументов (id или slug) для просмотра. Но вы будете извлекать объект из базы данных дважды, сначала в декораторе, а затем в представлении.

...