我在一个模板中使用Django DeleteView,并且我创建了一个url & view。是否可以跳过加载_confirm_delete模板的过程,直接发布删除操作。
sz81bmfz1#
DeleteView响应POST和GET请求,GET请求显示确认模板,POST删除示例。您可以发送POST请求,无需确认,表单如下:
DeleteView
POST
GET
<form method="POST" action="{% url "your_delete_url_name" %}"> {% csrf_token %}<input type="submit" value="DELETE"> </form>
如果你不想有一个链接,而不是形式按钮,使用一些javascript使不可见的形式,这将是提交的链接点击。使用GET请求进行更新或删除并不是一个好的做法,但如果您确实坚持要使用get方法,可以在类视图中将其快捷方式设置为post,即:
get
post
def get(self, *args, **kwargs): return self.post(*args, **kwargs)
rhfm7lfc2#
也可以在DeleteView中重新定义get()方法:
get()
class YourDeleteView(DeleteView): model = YourModel success_url = '<success_url>' def get(self, request, *args, **kwargs): return self.post(request, *args, **kwargs)
但要小心,确保这不会影响其他功能。
trnvg8h33#
是的,只要修改下一个参数,在返回响应中,确保传入的字典是这样的:{ 'next': '/<your_path_here>}/' },请确保在添加next参数之前提交更改。您可能需要更改视图的get和post函数。
{ 'next': '/<your_path_here>}/' }
next
brvekthn4#
或者,您只能通过将请求直接路由到类的delete方法来允许HTTP请求方法delete。
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
假设您的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>部分的原因。
pk_url_kwarg = 'pk'
<int:pk>
7rfyedvj5#
您可以覆盖get()方法,使其行为与delete()方法完全相同:
delete()
def get(self, request, *args, **kwargs): return self.delete(request, *args, **kwargs)
参见CCBV:https://ccbv.co.uk/projects/Django/4.1/django.views.generic.edit/DeleteView/
fcwjkofz6#
你所要做的就是重写删除视图的get_success_url方法,然后它将直接从数据库中删除对象。例如:
get_success_url
class YourView(DeleteView): model = YourModel def get_success_url(self): return reverse('your_redirect_view')
6条答案
按热度按时间sz81bmfz1#
DeleteView
响应POST
和GET
请求,GET
请求显示确认模板,POST
删除示例。您可以发送
POST
请求,无需确认,表单如下:如果你不想有一个链接,而不是形式按钮,使用一些javascript使不可见的形式,这将是提交的链接点击。
使用
GET
请求进行更新或删除并不是一个好的做法,但如果您确实坚持要使用get
方法,可以在类视图中将其快捷方式设置为post
,即:rhfm7lfc2#
也可以在
DeleteView
中重新定义get()
方法:但要小心,确保这不会影响其他功能。
trnvg8h33#
是的,只要修改下一个参数,在返回响应中,确保传入的字典是这样的:
{ 'next': '/<your_path_here>}/' }
,请确保在添加next
参数之前提交更改。您可能需要更改视图的get
和post
函数。brvekthn4#
或者,您只能通过将请求直接路由到类的
delete
方法来允许HTTP请求方法delete
。假设您的URL如下所示:
为了清楚地了解为什么这样做,必须分析
post
和delete
方法。post
只调用delete
,delete
获取对象和成功URL,删除对象,然后重定向到您提供的成功URL。pk_url_kwarg = 'pk'
是我在URL中显示<int:pk>
部分的原因。7rfyedvj5#
您可以覆盖
get()
方法,使其行为与delete()
方法完全相同:参见CCBV:https://ccbv.co.uk/projects/Django/4.1/django.views.generic.edit/DeleteView/
fcwjkofz6#
你所要做的就是重写删除视图的
get_success_url
方法,然后它将直接从数据库中删除对象。例如: