22👍
The plusses in a query string are the normal and correct encoding for spaces. This is a historical artifact; the form value encoding for URLs differs ever so slightly from encoding other elements in the URL.
Django is responsible for decoding the query string back to key-value pairs; that decoding includes decoding the URL percent encoding, where a +
is decoded to a space.
When using the test client, you pass in unencoded data, so you’d use:
client.get('/page/', {'filter': 'one and two'})
This is then encoded to a query string for you, and subsequently decoded again when you try and access the parameters.
3👍
This is because the test client (actually, RequestFactory) runs django.utils.http.urlencode
on your data, resulting in filter=one%2Band%2Btwo
. Similarly, if you were to use {'filter': 'one and two'}
, it would be converted to filter=one%20and%20two
, and would come into your view with spaces.
If you really absolutely must have the pluses in your query string, I believe it may be possible to manually override the query string with something like: client.get('/page/', QUERY_STRING='filter=one+and+two')
, but that just seems unnecessary and ugly in my opinion.
- Group by weeks, months, days
- Django queryset order_by dates near today
- How to reverse_lazy to a view/url with variable?