Python Django:通过GET请求、POST请求或URL进行搜索?

Python Django:通过GET请求、POST请求或URL进行搜索?,python,django,Python,Django,我正在Django中实现一个搜索表单。我可以做一个POST或GET请求。每个都有自己的用例(POST请求,如果我想更改服务器上的数据,GET请求,如果我只想从服务器获取数据) 通过POST请求(搜索关键字在URL中不可见,而是在dict in request.POST中可见);缺点:我无法将搜索添加到书签中 通过GET请求(对于intancelocalhost:8000/books/?author=schultz,搜索关键字在URL中可见);缺点(?):URL处理程序无法处理部分?author

我正在Django中实现一个搜索表单。我可以做一个POST或GET请求。每个都有自己的用例(POST请求,如果我想更改服务器上的数据,GET请求,如果我只想从服务器获取数据)

  • 通过POST请求(搜索关键字在URL中不可见,而是在dict in request.POST中可见);缺点:我无法将搜索添加到书签中
  • 通过GET请求(对于intance
    localhost:8000/books/?author=schultz
    ,搜索关键字在URL中可见);缺点(?):URL处理程序无法处理部分
    ?author=schultz
    (请参见下面的[2])。我需要从我的视图函数中的
    request.GET.GET(“author”,None)
    读取数据
  • 或者直接在URL中,比如:
    localhost:8000/books/search/author/schultz
[1]中的作者说,Django处理URL的首选方式不是通过GET(例如:
/category\u check\u view/?item\u id=2
,而是通过GET处理URL(例如:
/category\u check\u view/2

如果我想实现这样的搜索:
localhost:8000/books/author/schultz
,那么我必须处理一个GET请求,通过
request.GET.GET(“author”,None)
读取参数
?author=schultz
,并在我看来,从这个URL执行重定向
localhost:8000/books
(其中我有一个表单和一个GET请求)发送给这个
localhost:8000/books/author/schultz

这种方法有意义吗?或者我把事情复杂化了吗?只需在GET请求时使用它来实现我的搜索表单


[1] 他说

GET参数不是由URL处理程序处理的,而是传递的 直接到GET param dict,可在request.GET视图中访问

Django(即首选)处理URL的方法是第一种


[2] 首先,GET用于读取数据,POST用于创建。由于搜索是读取数据的一种形式,您将使用GET

这就引出了url的问题。正如您所提到的,在Django中有两种不同的方法通过url传递参数:

  • 参数作为url的一部分:

    您的url正则表达式必须如下所示:

    url(r'^books/author/(?P<author>\w+)/$', 
        'yourviewname', 
        name='author_search'
    )
    
    您的URL将具有以下形状:
    /books/?author=author\u name\u here&other=other\u param

  • 这是一个选择的问题,主要取决于你想用什么。引用:

    不要沉迷于URI的美丽,它们是一种工具,而不是一件艺术品。
    -@Quentin-


    有关上述两种方法的简短实现示例,请查看

    也可用的是:

    from django.urls import path
    
    import <your_view> from views.py
    
    path('news/<str:author>/', <your_view>.as_view())
    
    从django.url导入路径
    从views.py导入
    路径('news/',.as_view())
    
    我不明白您在搜索时将如何修改数据。在大多数用例中,搜索都是使用GET请求完成的。我没有说我想修改数据。只是,如果我不希望搜索关键字显示在URL或日志文件中,可以通过POST请求来完成。etcI看不到重定向的必要性。搜索的要点是它可以接受多个参数,并显示组合查找的结果。无需重定向到任何地方。因此,您总是使用GET请求?非常好的答案!谢谢!如果我想在URL中使用参数实现它(您的第一个示例),逻辑是这样的吗?我会有一个
    books/
    页面,其中有一个搜索表单。现在提交搜索表单后,我会重定向到
    books/author/(searchword)
    ?或者我如何连接这两个URL
    books/
    books/author/(searchword)
    -我并不是说我更喜欢用那种方式进行搜索。只是想知道哪种方式是惯用的方式。@Ugur您不需要重定向到任何地方!您的视图只需返回查询结果即可(这两种情况下我都是这样做的!):)但搜索发生在本页
    books/
    。如果视图从
    request.GET.GET(“searchword”,None)
    读取搜索词,我的URL(突然)如何显示
    books/author/(searchword)
    。即使搜索发生在本页
    books/author/
    ,提交后,URL如何反映
    books/author/(searchword)
    ?我从根本上遗漏了什么吗?:)@Ugur看看这里:它可能会帮助你:)
    from django.urls import path
    
    import <your_view> from views.py
    
    path('news/<str:author>/', <your_view>.as_view())