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

Mic*_*unn 13 django django-class-based-views

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

在下面的示例中,我希望取消按钮将您带到success_url不删除对象.我试过<input type="submit" name="cancel" value="Cancel" />在模板上添加一个按钮.我可以通过覆盖类的post方法来检测是否按下了这个按钮AuthorDelete,但我无法弄清楚如何从那里重定向.

示例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)
Run Code Online (Sandbox Code Playgroud)

示例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>
Run Code Online (Sandbox Code Playgroud)

(从文档改编的例子)

Ala*_*air 14

您重写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)
Run Code Online (Sandbox Code Playgroud)

我曾经get_success_url()是通用的,它的默认实现是返回self.success_url.


Ber*_*pac 12

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

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

  • @MichaelDunn实际上你可以通过{{view.success_url}}访问url地址,所以不应该有额外的python代码 (3认同)

Int*_*nti 5

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

<a href="{{ view.get_success_url }}" class="btn btn-default">Cancel</a>
Run Code Online (Sandbox Code Playgroud)

注意:如果已将其子类化,则应通过getter访问它。

这在ContextMixin文档中有所说明

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