Доступ к объекту контекста в общем представлении на основе класса Django
-
26-10-2019 - |
Вопрос
Я использую 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 или слизняк) для просмотра. Но вы будете получать объект из базы данных дважды, сначала в своем декораторе, а затем в виде вида.