如何在django中向DeleteView添加取消按钮

如何在django中向DeleteView添加取消按钮,django,django-class-based-views,Django,Django Class Based Views,在Django中,向基于类的通用视图添加“取消”按钮的最佳方法是什么 在下面的示例中,我希望“取消”按钮将您带到success\u url,而不删除对象。我已尝试向模板添加按钮。我可以通过覆盖AuthorDelete类的post方法来检测是否按下了此按钮,但我无法确定如何从那里重定向 示例myapp/views.py: from django.views.generic.edit import DeleteView from django.core.urlresolvers import rev

在Django中,向基于类的通用视图添加“取消”按钮的最佳方法是什么

在下面的示例中,我希望“取消”按钮将您带到
success\u url
,而不删除对象。我已尝试向模板添加按钮
。我可以通过覆盖
AuthorDelete
类的post方法来检测是否按下了此按钮,但我无法确定如何从那里重定向

示例myapp/views.py:

from django.views.generic.edit import DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Author

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('author-list')

    def post(self, request, *args, **kwargs):
        if request.POST["cancel"]:
            return ### return what? Can I redirect from here?
        else:
            return super(AuthorDelete, self).post(request, *args, **kwargs)
示例myapp/author\u confirm\u delete.html:

<form action="" method="post">{% csrf_token %}
    <p>Are you sure you want to delete "{{ object }}"?</p>
    <input type="submit" value="Confirm" />
    <input type="submit" name="cancel" value="Cancel" /> 
</form>
{%csrf\u令牌%}
确实要删除“{{object}}”吗


(示例改编自)

您覆盖
post
方法并检查是否按下了取消按钮的方法是正确的。您可以通过返回一个
HttpResponseRedirect
实例来重定向

from django.http import HttpResponseRedirect

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('author-list')

    def post(self, request, *args, **kwargs):
        if "cancel" in request.POST:
            url = self.get_success_url()
            return HttpResponseRedirect(url)
        else:
            return super(AuthorDelete, self).post(request, *args, **kwargs)

我使用了
get\u success\u url()
作为泛型,它的默认实现是返回
self.success\u url

为什么不简单地将一个“取消”链接放到
success\u url
而不是一个按钮?你可以用CSS设计它的样式,使它看起来像一个按钮


这样做的好处是不使用POST表单进行简单的重定向,这会混淆搜索引擎并破坏Web模型。此外,您不需要修改Python代码。

如果使用CBV,您可以直接从模板访问
视图

<a href="{{ view.get_success_url }}" class="btn btn-default">Cancel</a>

注意:您应该通过getter访问它,以防它被子类化

这一点在

所有基于类的通用视图的模板上下文都包括一个
视图
指向视图实例的变量

from django.http import HttpResponseRedirect

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('author-list')

    def post(self, request, *args, **kwargs):
        if "cancel" in request.POST:
            url = self.get_success_url()
            return HttpResponseRedirect(url)
        else:
            return super(AuthorDelete, self).post(request, *args, **kwargs)

您是否需要get_success_url,为什么不直接使用:

取消


并转到您想要的任何其他url?

具有button类型的元素,将不会发送POST请求。因此,您可以使用它执行如下http重定向:

<button type="button" onclick="location.href='{{ BASE_URL }}replace-with-url-to-redirect-to/'">Cancel</button>
取消

这些都是这种方法的好论据。但要做到这一点,我必须将success\u url添加到模板上下文中,因此我仍然需要稍微修改python代码。@MichaelDunn实际上您可以通过{{view.success\u url}访问url地址,因此不应该有额外的python代码使用
get_success\u url
的好处是,在按下取消按钮的情况下,它会将用户带到一个有意义的目的地。当您使用视图处理几种不同类型的对象时,这一点尤为重要。