Django DetailView-如何将get_对象更改为检查字段

2024-10-05 14:24:49 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我想制作一个DetailView来显示照片本身及其相关信息。不过,我想让它确保用户也有权访问照片。

这是视图的url.py

url(r'^photo/(?P<slug>[\-\d\w]+)/$', views.PhotoDetail.as_view(), name='photo'),

这是views.py

class PhotoDetail(DetailView):
    template_name = 'otologue/photo_detail.html'

    def get_object(self, queryset=None):
        slug = self.get_slug_field()
        print(slug)
        object_instance = Photo.objects.filter(slug=slug)
        print(object_instance)
        object_user = object_instance.photoextended.user
        user = get_object_or_404(User, username=self.request.user)  # Get the user in the view

        if object_user != user:  # See if the object_user is the same as the user
            return HttpResponseForbidden('Permission Error')

        else:
            return object_instance

正如你所看到的,我试图get_slug_field(),但当我打印它时,它只会说“slug”,而slug应该说url中的objects slug。 从这里,object_实例没有任何对象,然后为什么我试图从中获取用户,它找不到任何数据。


Tags: theinstance用户pyselfurlgetobject
1条回答
网友
1楼 · 发布于 2024-10-05 14:24:49

DetailViewget_object方法已经知道如何通过slug获取对象。无需重复此代码,只需调用super()

然后您可以直接将用户与self.request.user进行比较-不需要使用get_object_or_404从数据库中重新获取用户。

最后,您不能从get_object返回响应,该方法用于返回对象。但是,您可以引发类似Http404的异常。

from django.http import Http404

class PhotoDetail(DetailView):

    def get_object(self, queryset=None):
        obj = super(PhotoDetail, self).get_object(queryset=queryset)
        if obj.user != obj.photoextended.user:
            raise Http404()
        return obj

在基于类的视图中,一种常见的方法是重写get_queryset并按用户过滤。获取对象时,get_object方法将使用此queryset。如果对象不在queryset中,那么用户将得到404错误。

class PhotoDetail(DetailView):

    def get_queryset(self):
        queryset = super(PhotoDetail, self).get_queryset()
        return queryset.filter(photoextended__user=self.request.user)

相关问题 更多 >