当 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
为了澄清 camflan 的 explanation,假设您有
规则 url(regex=r'^user/(?P
对 http://domain/user/thaiyoshi/?message=Hi 的传入请求
URL 调度程序规则将捕获部分 URL path(此处为 "user/thaiyoshi/"
)并将它们与请求对象一起传递给视图函数。
解析查询字符串(此处为 message=Hi
)并将参数作为 QueryDict
存储在 request.GET
中。没有对 HTTP GET 参数进行进一步的匹配或处理。
此视图函数将使用从 URL 路径中提取的两个部分和一个查询参数:
def profile_page(request, username=None):
user = User.objects.get(username=username)
message = request.GET.get('message')
作为旁注,您将在 request.method
中找到请求方法(在本例中为 "GET"
,对于提交的表单通常为 "POST"
)。在某些情况下,检查它是否符合您的期望是很有用的。
更新:在决定是否使用 URL 路径或查询参数来传递信息时,以下可能会有所帮助:
使用 URL 路径来唯一标识资源,例如 /blog/post/15/(不是 /blog/posts/?id=15)
使用查询参数更改资源的显示方式,例如 /blog/post/15/?show_comments=1 或 /blog/posts/2008/?sort_by=date&direction=desc
为了制作人性化的 URL,避免使用 ID 号并使用例如日期、类别和/或 slug:/blog/post/2008/09/30/django-urls/
使用 GET
request.GET["id"]
使用 POST
request.POST["id"]
KeyError
异常。这样做是明智的(例如request.POST.get('id', '')
)。
有人会好奇如何在文件 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"
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
对于只有 request
对象的情况,您可以使用 request.parser_context['kwargs']['your_param']
如果您的 URL 看起来像这样,您有两种常用的方法来做到这一点:
https://domain/method/?a=x&b=y
版本 1:
如果特定密钥是强制性的,您可以使用:
key_a = request.GET['a']
如果键存在,则返回值 a
,否则返回 exception。
版本 2:
如果您的密钥是可选的:
request.GET.get('a')
您可以尝试不带任何参数,这不会崩溃。因此,您可以使用 try: except:
包装它并在示例中返回 HttpResponseBadRequest()
。这是一种简化代码的简单方法,无需使用特殊的异常处理。
我想分享一个可以节省您一些时间的提示。
如果您打算在 urls.py
文件中使用类似的内容:
url(r'^(?P<username>\w+)/$', views.profile_page,),
这基本上意味着www.example.com/<username>
。请务必将它放在您的 URL 条目的末尾,否则,它很容易与下面的 URL 条目发生冲突,即访问其中一个将给您一个不错的错误:{ 2}
我自己刚刚经历过;希望能帮助到你!
这些查询目前以两种方式完成。如果要访问查询参数 (GET),可以查询以下内容:
http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1
如果要访问POST传递的参数,需要这样访问:
request.data.get('role', None)
使用 'get()' 访问字典 (QueryDict),您可以设置默认值。在上述情况下,如果未通知“状态”或“角色”,则值为无。
如果您只能访问视图对象,那么您可以通过这种方式获取 URL 路径中定义的参数:
view.kwargs.get('url_param')
如果您只能访问请求对象,请使用以下内容:
request.resolver_match.kwargs.get('url_param')
在 Django 3 上测试。
如果您不知道参数的名称并希望全部使用它们,您可以使用 request.GET.keys()
或 dict(request.GET)
函数
这是另一个可以实施的替代解决方案:
在 URL 配置中:
urlpatterns = [path('runreport/<str:queryparams>', views.get)]
在视图中:
list2 = queryparams.split("&")
您不妨检查 request.META 字典以访问许多有用的东西,例如 PATH_INFO、QUERY_STRING
# for example
request.META['QUERY_STRING']
# or to avoid any exceptions provide a fallback
request.META.get('QUERY_STRING', False)
你说它返回空查询字典
我认为您需要调整您的 url 以接受必需或可选的 args 或 kwargs Django 为您提供了 regrex 所需的所有功能,例如:
url(r'^project_config/(?P<product>\w+)/$', views.foo),
django-optional-url-parameters 上有关此的更多信息
视图.py
from rest_framework.response import Response def update_product(request, pk): return Response({"pk":pk})
pk 表示primary_key。
网址.py
from products.views import update_product from django.urls import path urlpatterns = [ ..., path('update/products/
def update_product(request, pk=None):
pk 是可选的...
update/products//
,最后带有双斜杠,因为它是空的。那么路径应该是这样的:path('update/products/<int:pk>', update_product)
,而不是这样的:path('update/products/<int:pk>/', update_product)
,我已经更新了。我删除了问题答案中的最后一个斜杠。差异是最后一个斜线。 :) :)
url 参数可能被 request.query_params
捕获
self.kwargs['parameter']