我正在创建一个搜索栏,我想在搜索栏中使用“#”,直到URL中包含“%23”为止一切正常,但是当我用“#”更改它时,视图将不会得到任何查询字符串
这是针对Django 2.2.1
my view:
class SearchGalleryView(generic.TemplateView):
...
def get_context_data(self,*args,**kwargs):
print(self.request.GET)
first url:
http://localhost:8000/gallery/search/?gallery_search=%23sometag
first result:
<QueryDict: {'gallery_search': ['#sometag']}>
second url:
http://localhost:8000/gallery/search/?gallery_search=#sometag
second result:
<QueryDict: {'gallery_search': ['']}>
答案 0 :(得分:1)
简短答案:您不能在查询字符串中使用#
,因为它用于指定锚点。
您不能直接在查询字符串中使用哈希字符(#
),因为该字符通常用于指定锚点。确实,像
https://stackoverflow.com/questions/56146438/django-can-not-recognize-in-url#56146792
这样的URL意味着您引用了56146792
锚点(此处#56146792
将引用此答案)。
查询字符串用percent encoding编码。像Wikipedia page on Query string says:
某些字符不能成为URL的一部分(例如空格),而另一些字符在URL中具有特殊含义: 例如,字符
。#
可用于进一步指定 (或片段)
通常,您不必为此担心。如果您使用将通过GET传输的<form>
,则浏览器应使用百分比编码对数据进行正确编码,因此它将像发现的那样使用%23
此外,您不需要自己解码查询字符串。 Django将正确解码查询字符串并将其转换为QueryDict
。例如:
>>> QueryDict('gallery_search=%23sometag')
<QueryDict: {'gallery_search': ['#sometag']}>
因此,编码变得透明:QueryDict
将正确解码,并且您会收到在搜索栏中输入的内容。