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

rur96b6h  于 2023-04-07  发布在  Go
关注(0)|答案(6)|浏览(125)

在Django中,在基于类的通用视图中添加“取消”按钮的最佳方法是什么?
在下面的例子中,我希望cancel按钮带你到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

pgpifvop

pgpifvop1#

你重写post方法并检查是否按下了cancel按钮的方法是可以的。你可以通过返回一个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

chhqkbe1

chhqkbe12#

为什么不简单地在success_url上放一个“取消”链接而不是一个按钮呢?你可以用CSS来设计它,使它看起来像一个按钮。
这样做的好处是不使用POST表单进行简单的重定向,因为POST表单会混淆搜索引擎并破坏Web模型。

2izufjch

2izufjch3#

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

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

注意:你应该通过getter来访问它,以防它被子类化。
这在ContextMixin文档中有说明
所有基于类的通用视图的模板上下文都包含一个指向View示例的view变量。

hjzp0vay

hjzp0vay4#

如果元素的类型为button,则不会发送POST请求。因此,您可以使用this来执行如下http重定向:

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

hmmo2u0o5#

这可能是最简单的方法来做什么OP问:

<input type="submit" value="Confirm" />
* <a href="{% url 'success_url' %}"><button type="button">Cancel</button></a>
shstlldc

shstlldc6#

你甚至需要get_success_url,为什么不直接用途:
取消
然后转到你想要的任何其他URL?

相关问题