将在URL中传递的其他参数设为可选

时间:2019-08-08 07:44:10

标签: django django-templates django-views django-urls

我有这个网址path('user/delete/<int:pk>/', views.UserDeleteView.as_view(), name='delete_user'),

通过传递pk要访问的用户的DeleteView来删除所选用户。但是,我想通过使用带有复选框的表单来删除多个用户。为此,我使用了单独的视图。

我的问题是,有什么办法可以使此<int:pk>成为可选参数,以便可以将同一视图用于POST和GET请求。以防万一我想对同一URL使用POST方法。能做到吗?有人说它可以在Ruby on Rails中完成。在Django中有什么方法可以做到这一点?

1 个答案:

答案 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请求,当然还要进行额外的检查,以查看用户是否有权进行更改。