题
我目前定义的经常表现在以捕捉的参数,在一个网址,作为所描述的教程。我怎么接参数,从该网址的一部分 HttpRequest
对象?我 HttpRequest.GET
目前返回的一个空的 QueryDict
对象。
我想学习如何做到这一点没有一个图书馆,所以我可以去了解决好。
解决方案
当网址如下:domain/search/?q=haha
时,
然后你会使用request.GET.get('q', '')
。
q
是您想要的参数,如果找不到''
,则URLconf
是默认值。
但是,如果您只是配置regex
,那么views.py
中的捕获将作为参数(或命名参数)传递给函数。
如:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
然后在你的<=>中你会有
def profile_page(request, username):
# Rest of the method
其他提示
澄清camflan的解释,让我们假设你已经
- 该规则
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
- 一个在进入要求
http://domain/user/thaiyoshi/?message=Hi
URL调度程序规则将会赶上的部件的网址 路径 (在这里 "user/thaiyoshi/"
),并通过他们的图功能与请求的对象。
Query string(这里 message=Hi
)是分析和参数被保存作为一个 QueryDict
在 request.GET
.没有进一步的匹配或处理HTTP获得的参数。
这个图功能,将使用两个部分提取的URL路径和查询参数:
def profile_page(request, username=None):
user = User.objects.get(username=username)
message = request.GET.get('message')
作为一个侧面说明,你会找到的请求的方法(在这种情况下 "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/
使用GET
request.GET["id"]
使用POST
request.POST["id"]
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
我想分享一个可能为您省时的提示。
如果您打算在 urls.py
文件中使用类似的内容:
url(r'^(?P<username>\w+)/
这基本上意味着
www.example.com/<username>
。请务必将其放在您的网址条目的末尾,否则,它很容易导致与下面的网址条目冲突,即访问其中一个将给您一个很好的错误:<代码>用户匹配查询不存在。
我自己刚刚体验过它;希望它有所帮助!, views.profile_page,),
这基本上意味着 www.example.com/<username>
。请务必将其放在您的网址条目的末尾,否则,它很容易导致与下面的网址条目冲突,即访问其中一个将给您一个很好的错误:<代码>用户匹配查询不存在。
我自己刚刚体验过它;希望它有所帮助!
对于只有 request
对象的情况,您可以使用 request.parser_context ['kwargs'] ['your_param']
如果您的网址如下所示,您有两种常用方法:
https://domain/method/?a=x&b=y
V1:
如果特定密钥是强制性的,您可以使用:
key_a = request.GET['a']
如果密钥存在,则返回 a
的值,否则返回异常。
V2:
如果您的钥匙是可选的:
request.GET.get('a')
你可以尝试不带任何参数,这不会崩溃。
所以你可以用 try:except:
包装它,并在示例中返回 HttpResponseBadRequest()
。
这是一种简单的方法,可以使代码不那么复杂,而无需使用特殊的异常处理。
这不是您要求的,但此代码段有助于管理< templates
中的code> query_strings 。
我想在这里添加一些我自己的选项。有人会想知道如何在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
此外,在Url中编写查询字符串时
http://servername:port/domain/search/?q=CA
不要将查询字符串包装在引号中,例如
http://servername:port/domain/search/?q="CA"