我正在Django中实现一个搜索表单。我可以做POST或GET请求。每个都有它们的用例(POST请求,如果我想更改服务器上的数据,GET请求,如果我只想从服务器获取数据)。
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 Adam在this post中说
GET参数不由URL处理程序处理,而是传递 在request.GET。
的视图中直接访问GET param dict处理URL的Django(即首选)方式是第一种。
答案 0 :(得分:2)
首先, GET 用于读取数据, POST 用于创建。由于搜索是一种阅读数据,您将使用 GET !
这将我们带到了网址的问题。如你所述,有两种不同的方法可以通过Django中的url传递参数:
参数作为网址的一部分:
您的网址正则表达式必须如下所示:
url(r'^books/author/(?P<author>\w+)/$',
'yourviewname',
name='author_search'
)
您的网址形式为:/books/author/author_name_here
获取参数:
您的网址正则表达式如下所示:
url(r'^books/$',
'yourviewname',
name='book_search'
)
您的网址形式为:/books/?author=author_name_here&other=other_param
主要是根据您想要使用的内容进行选择。引用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())