没有确认模板的Django DeleteView

时间:2013-07-04 17:03:57

标签: python django

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

5 个答案:

答案 0 :(得分:45)

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)

答案 1 :(得分:8)

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

class YourDeleteView(DeleteView):

    model = YourModel
    success_url = '<success_url>'

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

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

答案 2 :(得分:1)

是的,只需更改下一个参数即可。在您的返回响应中,请确保您传入的字典具有以下内容:{ 'next': '/<your_path_here>}/' },确保在添加next参数之前提交更改。您可能希望更改视图的getpost功能。

答案 3 :(得分:0)

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

class YourView(DeleteView):
    model = YourModel

    def get_success_url(self):
        return reverse('your_redirect_view')

答案 4 :(得分:0)

或者,您只能通过将请求直接路由到类的 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 只调用 delete 并且 delete 获取对象和成功 URL,删除对象,然后重定向到您提供的成功 URL。 pk_url_kwarg = 'pk' 是我在 URL 中显示 <int:pk> 部分的原因。