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

时间:2013-07-16 14:03:04

标签: django django-class-based-views

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

在下面的示例中,我希望取消按钮将您带到success_url而不删除对象。我尝试在模板中添加按钮<input type="submit" name="cancel" value="Cancel" />。我可以通过覆盖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_confirm_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>

(示例改编自docs

5 个答案:

答案 0 :(得分:13)

您覆盖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_success_url()是通用的,其默认实现是返回self.success_url

答案 1 :(得分:11)

为什么不简单地将“取消”链接添加到success_url而不是按钮?您始终可以使用CSS对其进行样式设置,使其看起来像一个按钮。

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

答案 2 :(得分:3)

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

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

注意:如果已经被子类化,你应该通过getter访问它。

这在ContextMixin docs

中有说明
  

所有基于类的通用视图的模板上下文包含view   指向View实例的变量。

答案 3 :(得分:0)

您甚至需要get_success_url,为什么不只使用:

取消

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

答案 4 :(得分:0)

具有按钮类型的元素,不会发送 POST 请求。因此,您可以使用它来执行这样的 http 重定向:

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