【问题标题】:Django DeleteView without confirmation template没有确认模板的 Django DeleteView
【发布时间】:2013-07-04 17:03:57
【问题描述】:

我在模板中使用 Django DeleteView,并创建了一个 url 和视图。 是否可以跳过加载_confirm_delete模板的过程并立即发布删除。

【问题讨论】:

    标签: python django


    【解决方案1】:

    DeleteView 响应POSTGET 请求,GET 请求显示确认模板,而POST 删除实例。

    您可以发送POST 请求,无需确认,格式如下:

    <form method="POST" action="{% url "your_delete_url_name" %}">
       {% csrf_token %}<input type="submit" value="DELETE">
    </form>
    

    如果您不想使用链接代替表单按钮,请使用一些 javascript 制作不可见的表单,该表单将在链接点击时提交。

    使用GET请求更新或删除不是一个好习惯,但如果你真的坚持你可以在你的类视图中将get方法快捷方式到post,即:

    def get(self, *args, **kwargs):
        return self.post(*args, **kwargs)
    

    【讨论】:

      【解决方案2】:

      或者您可以在您的DeleteView 中重新定义get() 方法:

      class YourDeleteView(DeleteView):
      
          model = YourModel
          success_url = '<success_url>'
      
          def get(self, request, *args, **kwargs):
              return self.post(request, *args, **kwargs)
      

      但要小心,确保这不会影响其他功能。

      【讨论】:

        【解决方案3】:

        是的,只需更改下一个参数。在您的返回响应中,确保您传入的字典是这样的:{ 'next': '/&lt;your_path_here&gt;}/' },确保在添加 next 参数之前提交更改。您可能想要更改视图的 getpost 函数。

        【讨论】:

        • 我没有任何获取或发布视图,所有内容都使用 DeleteView 生成
        • 好吧,我不认为你可以在不改变 post 函数的情况下改变它,并且从 1.5 开始(据我所知)看文档:docs.djangoproject.com/en/1.5/ref/class-based-views/…。如果您不知道如何在 CBV 中使用 get()post() 函数,那么我建议您了解它们。
        【解决方案4】:

        或者您只能通过将请求直接路由到您的类的 delete 方法来允许 HTTP 请求方法 delete

        from django.views.generic import DeleteView
        from django.http import HttpResponseForbidden
        
        class PostDeleteView(DeleteView):
            model = Post
            http_method_names = ['delete']
        
            def dispatch(self, request, *args, **kwargs):
                # safety checks go here ex: is user allowed to delete?
                if request.user.username != kwargs['username']:
                    return HttpResponseForbidden()
                else:
                    handler = getattr(self, 'delete')
                    return handler(request, *args, **kwargs)
        
            def get_success_url(self):
                username = self.kwargs.get('username')
                success_url = str(reverse_lazy('post:user_home', kwargs={'username': username}))
                return success_url
        

        假设您的网址如下所示:

        path('posts/delete/<int:pk>/', PostDeleteView.as_view(), name='post_delete'),
        

        为了清楚为什么它有效,您必须分析postdelete 方法。

        def post(self, request, *args, **kwargs):
            return self.delete(request, *args, **kwargs)
        
        def delete(self, request, *args, **kwargs):
            """
            Call the delete() method on the fetched object and then redirect to the
            success URL.
            """
            self.object = self.get_object()
            success_url = self.get_success_url()
            self.object.delete()
            return HttpResponseRedirect(success_url)
        

        post 只调用deletedelete 获取对象和成功URL,删除对象,然后重定向到您提供的成功URL。 pk_url_kwarg = 'pk' 是我在 URL 中显示 &lt;int:pk&gt; 部分的原因。

        【讨论】:

          【解决方案5】:

          您所要做的就是覆盖删除视图的get_success_url 方法。然后它将直接从数据库中删除对象。例如:

          class YourView(DeleteView):
              model = YourModel
          
              def get_success_url(self):
                  return reverse('your_redirect_view')
          

          【讨论】:

          • 这个答案没有回答问题
          猜你喜欢
          • 2015-10-28
          • 2017-08-27
          • 2018-08-14
          • 1970-01-01
          • 2016-12-17
          • 2015-08-22
          • 2012-03-21
          • 1970-01-01
          • 2022-01-15
          相关资源
          最近更新 更多