Answers:
当url如:时domain/search/?q=haha
,您将使用request.GET.get('q', '')
。
q
是您想要的参数,并且''
是默认值(如果q
找不到)。
但是,如果您只是配置URLconf
,则从中捕获的内容regex
将作为参数(或命名参数)传递给函数。
如:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
然后,在您中views.py
您将拥有
def profile_page(request, username):
# Rest of the method
self.kwargs['parameter']
为了澄清camflan的解释,让我们假设您有
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
http://domain/user/thaiyoshi/?message=Hi
URL调度程序规则将捕获URL 路径的一部分(此处为"user/thaiyoshi/"
),并将它们与请求对象一起传递给view函数。
message=Hi
解析查询字符串(此处),并将参数存储为QueryDict
in request.GET
。没有完成对HTTP GET参数的进一步匹配或处理。
此视图函数将使用从URL路径提取的两个部分以及一个查询参数:
def profile_page(request, username=None):
user = User.objects.get(username=username)
message = request.GET.get('message')
另外,您会在中找到request方法(在这种情况下"GET"
,通常是针对提交的表单"POST"
)request.method
。在某些情况下,检查它是否符合您的期望很有用。
更新:在决定是否使用URL路径或查询参数来传递信息时,以下内容可能会有所帮助:
/blog/post/15/
(不是/blog/posts/?id=15
)/blog/post/15/?show_comments=1
或/blog/posts/2008/?sort_by=date&direction=desc
/blog/post/2008/09/30/django-urls/
我想在这里添加一些我自己的选项。有人会想知道如何在urls.py中设置路径,例如
domain/search/?q=CA
这样我们就可以调用查询。
事实是,没有必要在urls.py中设置这样的路由。您需要设置的只是urls.py中的路由
urlpatterns = [
path('domain/search/', views.CityListView.as_view()),
]
当您输入http:// servername:port / domain / search /?q = CA时。查询部分“?q = CA”将自动保留在哈希表中,尽管您可以参考
request.GET.get('q', None).
这是一个例子(views.py)
class CityListView(generics.ListAPIView):
serializer_class = CityNameSerializer
def get_queryset(self):
if self.request.method == 'GET':
queryset = City.objects.all()
state_name = self.request.GET.get('q', None)
if state_name is not None:
queryset = queryset.filter(state__name=state_name)
return queryset
此外,当您在网址中编写查询字符串时
http://servername:port/domain/search/?q=CA
不要将查询字符串用引号引起来,例如
http://servername:port/domain/search/?q="CA"
我想分享一个技巧,可以节省您一些时间。
如果您打算在urls.py
文件中使用类似这样的内容:
url(r'^(?P<username>\w+)/$', views.profile_page,),
这基本上意味着www.example.com/<username>
。请务必将其放置在你的URL条目的结束,否则,很容易出现低于后面的URL条目引起冲突,IE浏览器访问他们中的一个将让你漂亮的错误:User matching query does not exist.
我刚刚经历了它自己; 希望能帮助到你!
如果您的网址看起来像这样,您有两种常用的方法:
https://domain/method/?a=x&b=y
v1:
如果必须使用特定密钥,则可以使用:
key_a = request.GET['a']
这将返回a
if键存在的值,如果不存在则返回Exception。
v2:
如果您的键是可选的:
request.GET.get('a')
您可以尝试不使用任何参数而不会崩溃。因此,您可以将其包装起来try: except:
并返回HttpResponseBadRequest()
示例。这是一种无需使用特殊的Exceptions处理就可以简化代码的简单方法。