我正在定义正则表达式以捕获url中的参数,如教程中所述。如何从作为HttpRequest
对象的一部分的URL访问参数?我的HttpRequest.GET
当前返回一个空的QueryDict
对象。
我想学习如何在没有图书馆的情况下这样做,这样我就能更好地了解Django。
答案 0 :(得分:576)
当网址如下: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
答案 1 :(得分:306)
为了澄清camflan的解释,让我们假设你有
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
http://domain/user/thaiyoshi/?message=Hi
URL调度程序规则将捕获URL path (此处为"user/thaiyoshi/"
)的部分内容,并将它们与请求对象一起传递给view函数。
解析查询字符串(此处为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')
作为旁注,您会在"GET"
中找到请求方法(在本例中为"POST"
,以及通常为request.method
提交的表单)。在某些情况下,检查它是否符合您的期望是有用的。
更新:在决定是否使用网址路径或查询参数传递信息时,以下内容可能有所帮助:
/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/
答案 2 :(得分:46)
使用GET
request.GET["id"]
使用POST
request.POST["id"]
答案 3 :(得分:20)
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
答案 4 :(得分:16)
我想分享一个可能为您省时的提示
如果您打算在urls.py
文件中使用此类内容:
url(r'^(?P<username>\w+)/$', views.profile_page,),
这基本上意味着www.example.com/<username>
。请务必将其放在URL条目的末尾,否则,它很容易导致与下面的URL条目冲突,即访问其中一个将给您一个很好的错误:{ {1}}
我自己刚刚体验过它;希望它有所帮助!
答案 5 :(得分:11)
对于只有request
对象的情况,您可以使用request.parser_context['kwargs']['your_param']
答案 6 :(得分:10)
如果您的网址如下所示,您有两种常用方法:
https://domain/method/?a=x&b=y
V1:
如果特定密钥是强制性的,您可以使用:
key_a = request.GET['a']
如果密钥存在,则返回a
的值,否则返回异常。
V2:
如果您的钥匙是可选的:
request.GET.get('a')
你可以尝试不带任何参数,这不会崩溃。
因此,您可以使用try: except:
将其换行并在示例中返回HttpResponseBadRequest()
。
这是一种简单的方法,可以使代码不那么复杂,而无需使用特殊的异常处理。
答案 7 :(得分:8)
这不是您要求的,但this snippet有助于管理query_strings
中的templates
。
答案 8 :(得分:5)
我想在这里添加一些自己的选项。有人会想知道如何在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时。查询部分&#39;?q = CA&#39;将自动保留在您可以引用的哈希表中
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"
答案 9 :(得分:3)
如果您仅有权访问视图对象,则可以通过以下方式获取URL路径中定义的参数:
view.kwargs.get('url_param')
如果您只能访问请求对象,请使用以下命令:
request.resolver_match.kwargs.get('url_param')
在Django 3上测试。
答案 10 :(得分:3)
如果您不知道参数的名称并希望使用它们,您可以使用 request.GET.keys()
或 dict(request.GET)
函数
答案 11 :(得分:1)
这是可以实现的另一种替代解决方案:
在URL配置中:
urlpatterns = [path('runreport/<str:queryparams>', views.get)]
在视图中:
list2 = queryparams.split("&")
答案 12 :(得分:0)
这些查询当前以两种方式完成。如果要访问查询参数(GET),可以查询以下内容:
http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1
如果要访问POST传递的参数,则需要使用以下方式进行访问:
request.data.get('role', None)
使用“ get()”访问字典(QueryDict),可以设置默认值。在上述情况下,如果未告知'状态'或'角色',则值为None。
答案 13 :(得分:0)
您也可以检查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)
您说它返回空查询字典
我认为您需要调整网址以接受必需或可选的args或kwargs Django通过regrex获得了所需的全部功能,
url(r'^project_config/(?P<product>\w+)/$', views.foo),
有关更多信息,请访问django-optional-url-parameters
答案 14 :(得分:0)
要执行此操作,只需在javascript中键入以下内容即可:
function getParams(url) {
var params = {};
var parser = document.createElement('a');
parser.href = url;
var query = parser.search.substring(1);
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
params[pair[0]] = decodeURIComponent(pair[1]);
}
return params;
};
var url = window.location.href;
getParams(url);