Django:通过GET请求,POST请求或URL搜索?

时间:2017-05-30 11:57:26

标签: python django

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

  • 通过POST请求(搜索关键字在URL中不可见,而是在request.POST中的dict中);缺点:我无法为搜索添加书签
  • 通过GET请求(搜索关键字在URL中可见,用于intance localhost:8000/books/?author=schultz);缺点(?):URL处理程序无法处理部分?author=schultz(参见下面的[2])。我需要在我的视图函数中读取request.GET.get("author", None)中的数据。
  • 或直接在网址中如下:localhost:8000/books/search/author/schultz

[1]中的作者说,Django处理URL的首选方式不是通过GET(如此:/category_check_view/?item_id=2,而是像/category_check_view/2

如果我想实现这样的搜索:localhost:8000/books/author/schultz,那么我必须处理GET请求,通过?author=schultz读取参数request.GET.get("author", None)并在我的视图中执行重定向从此网址localhost:8000/books(其中我有表单和GET请求)到此localhost:8000/books/author/schultz

这种方法有意义吗?还是我过于复杂的事情?请将其留在GET请求中以实现我的搜索表单?

[1] Yuval Adamthis post中说

  

GET参数不由URL处理程序处理,而是传递   在request.GET。

的视图中直接访问GET param dict      

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

[2] Django docs: What the URLconf searches against

2 个答案:

答案 0 :(得分:2)

首先, GET 用于读取数据, POST 用于创建。由于搜索是一种阅读数据,您将使用 GET

这将我们带到了网址的问题。如你所述,有两种不同的方法可以通过Django中的url传递参数:

  1. 参数作为网址的一部分:

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

    url(r'^books/author/(?P<author>\w+)/$', 
        'yourviewname', 
        name='author_search'
    )
    

    您的网址形式为:/books/author/author_name_here

  2. 获取参数:

    您的网址正则表达式如下所示:

    url(r'^books/$', 
        'yourviewname', 
        name='book_search'
    )
    

    您的网址形式为:/books/?author=author_name_here&other=other_param

  3. 主要是根据您想要使用的内容进行选择。引用a great answer

      

    不要对URI的美感进行痴迷,它们不是一件艺术品。
        - @Quentin -

    <小时/> 有关上述两种方式的简短实施示例,请查看this link

答案 1 :(得分:1)

还可以使用的是:

from django.urls import path

import <your_view> from views.py

path('news/<str:author>/', <your_view>.as_view())