我有这个网址path('user/delete/<int:pk>/', views.UserDeleteView.as_view(), name='delete_user'),
通过传递pk
要访问的用户的DeleteView
来删除所选用户。但是,我想通过使用带有复选框的表单来删除多个用户。为此,我使用了单独的视图。
我的问题是,有什么办法可以使此<int:pk>
成为可选参数,以便可以将同一视图用于POST和GET请求。以防万一我想对同一URL使用POST方法。能做到吗?有人说它可以在Ruby on Rails中完成。在Django中有什么方法可以做到这一点?
答案 0 :(得分:0)
您可以定义两条路径,一条路径具有主键,另一条路径不具有主键:
path('user/delete/', views.UserDeleteView.as_view(), name='delete_user'),
path('user/delete/<int:pk>/', views.UserDeleteView.as_view(), name='delete_user_id'),
因此,这里有两个视图:'delete_user'
不包含pk
,而'delete_user_id'
不包含主键。两者都直接指向相同的UserDeleteView
。
您可以使用kwargs=
参数为缺少的参数注入一个值:
path('user/delete/', views.UserDeleteView.as_view(), name='delete_user', kwargs={'pk': None}),
path('user/delete/<int:pk>/', views.UserDeleteView.as_view(), name='delete_user_id'),
也就是说,使用GET请求应该没有副作用。 HTTP protocol [wiki]就是这样设计的:
GET方法请求指定资源的表示形式。使用GET的请求应该仅检索数据,并且没有其他作用。 (其他一些HTTP方法也是如此。)W3C已发布了有关此区别的指导原则,说:“ Web应用程序设计应以上述原则为基础,但也应以相关限制为基础。”
W3组织也有guidelines when to use GET or POST:
在以下情况下使用GET
:
- 交互更像是一个问题(即,它是一种安全的操作,例如查询,读取操作或查找)。
在以下情况下使用POST
:
- 互动更像是订单,或者
- 交互以用户会感知的方式(例如,对服务的订阅)更改资源状态,或者
- 使用户对交互结果负责。
如果要删除项目,通常会发出DELETE或POST请求。例如,Django将使用CSRF令牌保护此类请求,以防止cross-site request forgery [wiki]。
因此,我强烈建议您仅允许对这些视图进行POST / DELETE请求,当然还要进行额外的检查,以查看用户是否有权进行更改。