选择正确的Django Delete视图方法

时间:2019-05-08 19:37:43

标签: django

我正在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吗?这种方法的弊端是什么?也许是弊端?

1 个答案:

答案 0 :(得分:1)

两个基于类的删除视图和基于函数的视图(声明它的方式)之间存在主要区别。

CBV 接受getpostdelete http方法。当您向基于类的视图发送get请求时,它不会删除该对象。而是使用上下文中要删除的对象来呈现模板。这基本上是用来进行确认的。例如,您可以发送一个get请求,它将使用文本“您真的要删除吗?”来呈现一个模板。或“请确认等等。”。而且,如果您发送postdelete请求,它将实际上删除该对象并重定向到下一页。

另一方面,

FBV 使您可以完全控制自己想做什么。就像您声明的那样,它将接受任何请求类型并删除对象并重定向到下一页,因为您尚未在视图中进行任何请求类型检查,恕我直言,这不是一个好主意。您不应允许删除获取请求。它们应该是幂等的。 CBV还提供许多其他功能。例如,如果对象不存在,您的FBV将崩溃。相反,如果对象不存在,CBV将返回正确的404响应。

因此,我认为使用FBV并没有什么坏处,但是make足够强大和安全,可以处理各种情况(如果对象不存在该怎么办?如何确认?,GET应该只等幂)删除帖子?等)。或者只是使用CBV。