【发布时间】:2013-07-04 17:03:57
【问题描述】:
我在模板中使用 Django DeleteView,并创建了一个 url 和视图。 是否可以跳过加载_confirm_delete模板的过程并立即发布删除。
【问题讨论】:
我在模板中使用 Django DeleteView,并创建了一个 url 和视图。 是否可以跳过加载_confirm_delete模板的过程并立即发布删除。
【问题讨论】:
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)
【讨论】:
或者您可以在您的DeleteView 中重新定义get() 方法:
class YourDeleteView(DeleteView):
model = YourModel
success_url = '<success_url>'
def get(self, request, *args, **kwargs):
return self.post(request, *args, **kwargs)
但要小心,确保这不会影响其他功能。
【讨论】:
是的,只需更改下一个参数。在您的返回响应中,确保您传入的字典是这样的:{ 'next': '/<your_path_here>}/' },确保在添加 next 参数之前提交更改。您可能想要更改视图的 get 和 post 函数。
【讨论】:
post 函数的情况下改变它,并且从 1.5 开始(据我所知)看文档:docs.djangoproject.com/en/1.5/ref/class-based-views/…。如果您不知道如何在 CBV 中使用 get() 和 post() 函数,那么我建议您了解它们。
或者您只能通过将请求直接路由到您的类的 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> 部分的原因。
【讨论】:
您所要做的就是覆盖删除视图的get_success_url 方法。然后它将直接从数据库中删除对象。例如:
class YourView(DeleteView):
model = YourModel
def get_success_url(self):
return reverse('your_redirect_view')
【讨论】: