Django DetailView - 如何更改get_object以检查字段

时间:2017-03-07 16:11:17

标签: python django django-views django-class-based-views

所以我想创建一个DetailView来显示照片本身及其相关信息。但是,我希望确保用户也有权访问照片。

这是视图的urls.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应该说出url中的对象slug时才会说'slug'。 从这里,object_instance没有任何对象,然后为什么我试图从中获取用户,它找不到任何数据。

1 个答案:

答案 0 :(得分:17)

DetailView的{​​{1}}方法已知道如何通过slug获取对象。无需复制此代码,只需拨打get_object

然后,您可以直接将用户与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方法将使用此查询集。如果对象不在查询集中,则用户将收到404错误。

get_object