嗨,所以我有一个工作的观点。我想知道这是最好的还是好的方式。我希望有一个删除视图删除Photo对象,但仅当登录用户是与该对象关联的on时。
这是我的views.py
class PhotoDelete(DeleteView):
model = Photo
template_name = 'otologue/photo_delete.html'
success_url = reverse_lazy('otologue:photos')
def get(self, request, *args, **kwargs):
object_instance = self.get_object() # Get the object
object_user = object_instance.photoextended.user # Get the user who owns the object
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 render(request, self.template_name, {'object': object_instance})
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
如果您需要更多类似模特的信息,请提出要求。
答案 0 :(得分:0)
您不必致电get_object_or_404()
,因为self.request.user
已包含用户实例,因此您可以直接对其进行比较。
您应该调用(并返回结果)DeleteView的get()
方法,而不是自己渲染模板。
我还会使用LoginRequiredMixin
而不是装饰者,因为除了调用超级方法之外,你的dispatch()
现在什么也没做。
请注意,实际删除是在post()
方法中完成的。您应该将用户检查移至dispatch()
方法,否则可以通过伪造的POST请求绕过检查。
要更好地了解DeleteView在其方法中执行的操作,请检查其源代码(例如,在ccbv.co.uk处)