Ограничение доступа пользователей к детальному просмотру на основе значения поля модели в Django
Я учусь и у меня есть проект управления изменениями, где моя модель содержит поле confidential
, которое по умолчанию False
, однако при создании экземпляра так называемый initiator
может отметить его как True
. Это означает, что только пользователи, которые являются частью текущей записи, так называемые signees
, могут открыть и увидеть экземпляр. Я пытаюсь применить переопределение get_queryset к моему DetailView:
Это позволяет ограничить пользователей только теми, кто является моим signees
, но в случае, если мое поле confidential
будет False
, никто из них не сможет открыть эти экземпляры модели.
Есть ли где-нибудь место, где я могу ввести логику, чтобы позволить прямое открытие не конфиденциального экземпляра модели?
Благодарю за помощь...
Я решил эту проблему следующей модификацией кода:
class MocDetailView(LoginRequiredMixin, DetailView):
model = Moc
template_name = 'moc/moc_detail.html'
context_object_name = 'moc'
def get_object(self, queryset=None):
obj = super(MocDetailView, self).get_object(queryset=queryset)
print(obj)
confidential = obj.confidential
initiator = obj.initiator
# verifiers = obj.verifiers.all()
verifier = obj.verifiers.filter(verifier_name=self.request.user)
print(verifier)
# coordinators = obj.coordinators.all()
coordinator = obj.coordinators.filter(coordinator_name=self.request.user)
print(coordinator)
# reviewers = obj.reviewers.all()
reviewer = obj.reviewers.filter(reviewer_name=self.request.user)
print(reviewer)
# approvers = obj.approvers.all()
approver = obj.approvers.filter(approver_name=self.request.user)
print(approver)
# preimplements = obj.preimplements.all()
preimplement = obj.preimplements.filter(actionee_name=self.request.user)
print(preimplement)
# authorizers = obj.authorizers.all()
authorizer = obj.authorizers.filter(authorizer_name=self.request.user)
print(authorizer)
# postimplements = obj.postimplements.all()
postimplement = obj.postimplements.filter(actionee_name=self.request.user)
print(postimplement)
# closers = obj.closers.all()
closer = obj.closers.filter(closer_name=self.request.user)
print(closer)
if self.request.user.is_superuser or initiator == self.request.user or verifier or coordinator or reviewer or approver or preimplement or authorizer or postimplement or closer and confidential == True:
return obj
elif not confidential:
return obj
else:
raise Http404()