django无法识别URL中的#

时间:2019-05-15 09:51:43

标签: django django-views

我正在创建一个搜索栏,我想在搜索栏中使用“#”,直到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': ['']}>

1 个答案:

答案 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将正确解码,并且您会收到在搜索栏中输入的内容。