没有确认模板的Django DeleteView

问题描述 投票:0回答:6

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

python django
6个回答
75
投票

DeleteView
响应
POST
GET
 请求,
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)

21
投票

或者您可以在

get()
中重新定义
DeleteView
方法:

class YourDeleteView(DeleteView):

    model = YourModel
    success_url = '<success_url>'

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

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


2
投票

对 StackOverflow 将我的数据出售给 AI 不感兴趣。


1
投票

是的,只需更改下一个参数即可。在返回响应中,确保您传入的字典具有如下内容:

{ 'next': '/<your_path_here>}/' }
,确保在添加
next
参数之前提交更改。您可能想要更改视图的
get
post
功能。


1
投票

或者您只能通过将请求直接路由到类的

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'),

为了清楚其原理,您必须分析

post
delete
方法。

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
只需调用
delete
delete
获取对象和成功 URL,删除对象,然后重定向到您提供的成功 URL。
pk_url_kwarg = 'pk'
这就是我在 URL 中显示
<int:pk>
部分的原因。


-2
投票

您所要做的就是覆盖删除视图的

get_success_url
方法。然后它会直接从数据库中删除该对象。例如:

class YourView(DeleteView):
    model = YourModel

    def get_success_url(self):
        return reverse('your_redirect_view')
© www.soinside.com 2019 - 2024. All rights reserved.