我正在Django网站上工作,在找出正确/良好的方式来处理删除视图时遇到了问题。从我发现的方法来看,有两种方法:
1
class ObjectDeleteView(DeleteView):
model = Object
def get_success_url(self):
objectid = self.kwargs['object_id']
object = Object.objects.get(id = objectid)
container = object.container
containerid = container.id
url = reverse('Containers:showContainerContent', args=[containerid])
return url
def get_object(self):
return get_object_or_404(Object, pk=self.kwargs['object_id'])
2
def objectDelete(request, object_id):
object = Object.objects.get(id = object_id)
container = object.container
containerid = container.id
url = reverse('Containers:showContainerContent', args=[containerid])
return HttpResponseRedirect(url)
据我所知,两者都在做完全相同的事情-删除对象后,用户在Containers:showContainerContent下将看到页面。
我遇到的最大不同是为此进行单元测试(网站的简单调用和检查响应代码)时遇到的错误。使用选项1,我最终会收到错误消息
django.template.exceptions.TemplateDoesNotExist: ContainerApp/object_confirm_delete.html
据我所知-我没有此模板,这是DeleteView的默认模板,因此错误是正确的。问题是我不想有任何多余的页面。只需重定向用户即可。
我还测试了在选项1中将return url
更改为return HttpResponseRedirect(url)
,但结果是相同的。
我应该在这里做什么?我应该继续选择选项2吗?这种方法的弊端是什么?也许是弊端?
答案 0 :(得分:1)
两个基于类的删除视图和基于函数的视图(声明它的方式)之间存在主要区别。
CBV 接受get
,post
和delete
http方法。当您向基于类的视图发送get
请求时,它不会删除该对象。而是使用上下文中要删除的对象来呈现模板。这基本上是用来进行确认的。例如,您可以发送一个get请求,它将使用文本“您真的要删除吗?”来呈现一个模板。或“请确认等等。”。而且,如果您发送post
或delete
请求,它将实际上删除该对象并重定向到下一页。
FBV 使您可以完全控制自己想做什么。就像您声明的那样,它将接受任何请求类型并删除对象并重定向到下一页,因为您尚未在视图中进行任何请求类型检查,恕我直言,这不是一个好主意。您不应允许删除获取请求。它们应该是幂等的。 CBV还提供许多其他功能。例如,如果对象不存在,您的FBV将崩溃。相反,如果对象不存在,CBV将返回正确的404响应。
因此,我认为使用FBV并没有什么坏处,但是make足够强大和安全,可以处理各种情况(如果对象不存在该怎么办?如何确认?,GET
应该只等幂)删除帖子?等)。或者只是使用CBV。