详细视图中的django所有者权限

rmbxnbpk  于 2023-06-25  发布在  Go
关注(0)|答案(3)|浏览(98)

这是我的代码

class EnrollmentDetail(generic.DetailView):
   model = Enrollment
   template_name = 'enrollments/enrollment_detail.html'
   context_object_name = 'enrollment

简单的djeneric django详细视图。我希望只有此视图的所有者才能访问它。其他我不想要的人就去拿。我想限制他们的权限。我想在这种情况下提出错误,但不知道是哪一个。这是令人沮丧的,因为它不是复杂的问题,但不能解决它。我查看了很多关于这个问题的帖子,但没有一个提供了光滑和干净的解决方案(装饰器,supers(),查询集等)。
这是我的模型

class Enrollment(models.Model):
"""Defines Enrollment model"""

    doctor_name = models.ForeignKey(DoctorProfile, on_delete=models.CASCADE)
    patient_name = models.CharField(max_length=30)
    symptoms = models.CharField(max_length=80)
    diagnosis = models.CharField(max_length=30)
    received_at = models.DateTimeField(auto_now=True)
    room_number = models.PositiveIntegerField()

多谢帮忙

cvxl0en2

cvxl0en21#

简单地做一个if语句,检查登录的用户是否有超级用户权限:

class EnrollmentDetail(generic.DetailView):
    if request.user.is_superuser:
       model = Enrollment
       template_name = 'enrollments/enrollment_detail.html'
       context_object_name = 'enrollment
    else:
       # redirect to page
acruukt9

acruukt92#

也许你可以在细节视图中覆盖get_queryset,

def get_queryset(self):
    return self.model.objects.filter(user=self.request.user)
3z6pesqy

3z6pesqy3#

这是一个可能的解决方案,我想出了,而我在我的项目工作。重写DetailView中的dispatch函数,以检查尝试访问视图的用户是否是所有者。如果用户不是所有者,则调用handle_permission_denied()方法,该方法将我们重定向到urlpatterns('forbidden')中定义的某个URL。确保导入reverse_lazy和HttpResponseRedirect。

class CustomDetailView(LoginRequiredMixin, DetailView):
    model = ModelName

    def dispatch(self, request, *args, **kwargs):
        obj = self.get_object()

        if obj.user != request.user:
            return self.handle_permission_denied()
        return super().dispatch(request, *args, **kwargs)

    def handle_permission_denied(self):
        redirect_url = reverse_lazy('forbidden')
        return HttpResponseRedirect(redirect_url)

相关问题