所以我想制作一个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_实例没有任何对象,然后为什么我试图从中获取用户,它找不到任何数据。
DetailView
的get_object
方法已经知道如何通过slug获取对象。无需重复此代码,只需调用super()
。然后您可以直接将用户与
self.request.user
进行比较-不需要使用get_object_or_404
从数据库中重新获取用户。最后,您不能从
get_object
返回响应,该方法用于返回对象。但是,您可以引发类似Http404
的异常。在基于类的视图中,一种常见的方法是重写
get_queryset
并按用户过滤。获取对象时,get_object
方法将使用此queryset。如果对象不在queryset中,那么用户将得到404错误。相关问题 更多 >
编程相关推荐