【问题标题】:How to add a cancel button to DeleteView in django如何在 django 中向 DeleteView 添加取消按钮
【发布时间】:2013-07-16 14:03:04
【问题描述】:

在 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)

【问题讨论】:

    标签: django django-class-based-views


    【解决方案1】:

    您覆盖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。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这些都是这种方法的好论据。但要做到这一点,我必须将 success_url 添加到模板上下文中,所以我仍然需要稍微修改一下 python 代码。
      • @MichaelDunn 其实你可以通过 {{ view.success_url }} 访问url地址,所以不应该有额外的python代码
      【解决方案3】:

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

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

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

      这在ContextMixin docs中注明

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          你甚至需要get_success_url,为什么不直接使用:

          取消

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

          【讨论】:

          • 使用get_success_url 的好处是,在按下取消按钮的情况下,它会将用户带到一个有意义的目的地。当您重新使用视图来处理几种不同类型的对象时,这一点尤其重要。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-04-01
          • 1970-01-01
          • 2020-07-31
          • 1970-01-01
          相关资源
          最近更新 更多