Доступ к объекту контекста в общем представлении на основе класса Django

StackOverflow https://stackoverflow.com/questions/5814884

Вопрос

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

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)

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

Это было полезно?

Решение

Объект получен внутри метода Dispatch (), поэтому ваш декоратор не может его использовать. Вы можете проверить членство внутри метода overden 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)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top