【问题标题】:Django class-based view - DeleteView - How to disable confirmation requirementDjango 基于类的视图 - DeleteView - 如何禁用确认要求
【发布时间】:2012-03-21 11:49:47
【问题描述】:

我正在切换到基于类的视图。我还使用 JavaScript 来确认客户端的任何删除。 Django DeleteView 需要一个我不关心的删除确认模板。

有什么简单的方法可以在 Django 中禁用任何类型的删除确认?

class EntryDeleteView(DeleteView):
    model = Entry
    success_url = reverse_lazy('entry_list')   # go back to the list on successful del
    template_name = 'profiles/entry_list.html' # go back to the list on successful del

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(EntryDeleteView, self).dispatch(*args, **kwargs)

【问题讨论】:

  • 将此添加到删除视图允许通过 get 删除,但我将使用 post 解决方案。 [def get(self, *args, **kwargs): return self.delete(*args, **kwargs)]

标签: django confirmation django-class-based-views


【解决方案1】:

您应该从客户端进行 POST 查询(使用 AJAX 或 POST 表单)。这是因为如果您允许通过 GET 删除某些内容,您的服务将容易受到 CSRF 的攻击。有人会通过电子邮件或其他方式向您的管理员发送一封电子邮件,您会遇到麻烦。

【讨论】:

  • 所有删除都需要登录,这还不够吗?
  • 没有。看:我是邪恶的黑客,我知道您网站管理员的电子邮件。我给他发了一个链接到一些带有可爱小猫图片的页面,并在该页面上附加了类似 your_site/admin/profile/delete" width=1 height=1> 的内容。管理员看着小猫并删除了他的整个个人资料。浏览器不允许在其他站点上发布,而 Django 有一些 CSRF 保护,所以这不适用于 POST,这就是为什么删除需要 POST。
  • ilvar 忘记提及的是,管理员很可能对他自己的站点有一个活跃的登录会话,因此绕过了登录步骤。
【解决方案2】:

DeleteViewGET 上呈现确认页面,如果您使用POSTDELETE,则删除该对象。如果您的 JS 在确认后对 url 执行POST,它应该可以按照您的意愿工作。

【讨论】:

  • 是的,确认后发帖就可以得到js了。
猜你喜欢
  • 2017-08-27
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 2022-07-02
  • 2019-08-29
相关资源
最近更新 更多