844๐
When a URL is like domain/search/?q=haha
, you would use request.GET.get('q', '')
.
q
is the parameter you want, and ''
is the default value if q
isnโt found.
However, if you are instead just configuring your URLconf
**, then your captures from the regex
are passed to the function as arguments (or named arguments).
Such as:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
Then in your views.py
you would have
def profile_page(request, username):
# Rest of the method
442๐
To clarify camflanโs explanation, letโs suppose you have
- the rule
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
- an incoming request for
http://domain/user/thaiyoshi/?message=Hi
The URL dispatcher rule will catch parts of the URL path (here "user/thaiyoshi/"
) and pass them to the view function along with the request object.
The query string (here message=Hi
) is parsed and parameters are stored as a QueryDict
in request.GET
. No further matching or processing for HTTP GET parameters is done.
This view function would use both parts extracted from the URL path and a query parameter:
def profile_page(request, username=None):
user = User.objects.get(username=username)
message = request.GET.get('message')
As a side note, youโll find the request method (in this case "GET"
, and for submitted forms usually "POST"
) in request.method
. In some cases, itโs useful to check that it matches what youโre expecting.
Update: When deciding whether to use the URL path or the query parameters for passing information, the following may help:
- use the URL path for uniquely identifying resources, e.g.
/blog/post/15/
(not/blog/posts/?id=15
) - use query parameters for changing the way the resource is displayed, e.g.
/blog/post/15/?show_comments=1
or/blog/posts/2008/?sort_by=date&direction=desc
- to make human-friendly URLs, avoid using ID numbers and use e.g. dates, categories, and/or slugs:
/blog/post/2008/09/30/django-urls/
- [Django]-Malformed Packet: Django admin nested form can't submit, connection was reset
- [Django]-Where does pip install its packages?
- [Django]-Why is __init__ module in django project loaded twice
- [Django]-Itertools.groupby in a django template
- [Django]-Celery discover tasks in files with other filenames
- [Django]-Altering one query parameter in a url (Django)
66๐
Someone would wonder how to set path in file urls.py, such as
domain/search/?q=CA
so that we could invoke query.
The fact is that it is not necessary to set such a route in file urls.py. You need to set just the route in urls.py:
urlpatterns = [
path('domain/search/', views.CityListView.as_view()),
]
And when you input http://servername:port/domain/search/?q=CA. The query part โ?q=CAโ will be automatically reserved in the hash table which you can reference though
request.GET.get('q', None).
Here is an example (file 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
In addition, when you write query string in the URL:
http://servername:port/domain/search/?q=CA
Do not wrap query string in quotes. For example,
http://servername:port/domain/search/?q="CA"
- [Django]-IOS app with Django
- [Django]-Django โ Clean permission table
- [Django]-Django โ How to use decorator in class-based view methods?
33๐
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
- [Django]-Has Django served an excess of 100k daily visits?
- [Django]-Override existing Django Template Tags
- [Django]-Python Django Gmail SMTP setup
31๐
For situations where you only have the request
object you can use request.parser_context['kwargs']['your_param']
- [Django]-How do I remove Label text in Django generated form?
- [Django]-What is actually assertEquals in Python?
- [Django]-What are the limitations of Django's ORM?
27๐
You have two common ways to do that in case your URL looks like that:
https://domain/method/?a=x&b=y
Version 1:
If a specific key is mandatory you can use:
key_a = request.GET['a']
This will return a value of a
if the key exists and an exception if not.
Version 2:
If your keys are optional:
request.GET.get('a')
You can try that without any argument and this will not crash.
So you can wrap it with try: except:
and return HttpResponseBadRequest()
in example.
This is a simple way to make your code less complex, without using special exceptions handling.
- [Django]-Passing STATIC_URL to file javascript with django
- [Django]-How do I run tests for all my Django apps only?
- [Django]-DRF: custom ordering on related serializers
17๐
I would like to share a tip that may save you some time.
If you plan to use something like this in your urls.py
file:
url(r'^(?P<username>\w+)/$', views.profile_page,),
Which basically means www.example.com/<username>
. Be sure to place it at the end of your URL entries, because otherwise, it is prone to cause conflicts with the URL entries that follow below, i.e. accessing one of them will give you the nice error: User matching query does not exist.
Iโve just experienced it myself; hope it helps!
- [Django]-Django {% if forloop.first %} question
- [Django]-Does django with mongodb make migrations a thing of the past?
- [Django]-Django Admin app or roll my own?
12๐
These queries are currently done in two ways. If you want to access the query parameters (GET) you can query the following:
http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1
If you want to access the parameters passed by POST, you need to access this way:
request.data.get('role', None)
Accessing the dictionary (QueryDict) with โget()โ, you can set a default value. In the cases above, if โstatusโ or โroleโ are not informed, the values โโare None.
- [Django]-How about having a SingletonModel in Django?
- [Django]-Django + Ajax
- [Django]-Storing an Integer Array in a Django Database
11๐
If you donโt know the name of params and want to work with them all, you can use request.GET.keys()
or dict(request.GET)
functions
- [Django]-Django: Error: You don't have permission to access that port
- [Django]-Remove pk field from django serialized objects
- [Django]-Trying to migrate in Django 1.9 โ strange SQL error "django.db.utils.OperationalError: near ")": syntax error"
9๐
This is not exactly what you asked for, but this snippet is helpful for managing query_strings
in templates
.
- [Django]-Django REST Framework : "This field is required." with required=False and unique_together
- [Django]-Http POST drops port in URL
- [Django]-Storing an Integer Array in a Django Database
9๐
If you only have access to the view object, then you can get the parameters defined in the URL path this way:
view.kwargs.get('url_param')
If you only have access to the request object, use the following:
request.resolver_match.kwargs.get('url_param')
Tested on Django 3.
- [Django]-CORS error while consuming calling REST API with React
- [Django]-Django REST Framework : "This field is required." with required=False and unique_together
- [Django]-How to add new languages into Django? My language "Uyghur" or "Uighur" is not supported in Django
7๐
views.py
from rest_framework.response import Response
def update_product(request, pk):
return Response({"pk":pk})
pk means primary_key.
urls.py
from products.views import update_product
from django.urls import path
urlpatterns = [
...,
path('update/products/<int:pk>', update_product)
]
- [Django]-Mixin common fields between serializers in Django Rest Framework
- [Django]-Django storages aws s3 delete file from model record
- [Django]-Django proxy model and ForeignKey
6๐
You might as well check request.META dictionary to access many useful things like
PATH_INFO, QUERY_STRING
# for example
request.META['QUERY_STRING']
# or to avoid any exceptions provide a fallback
request.META.get('QUERY_STRING', False)
you said that it returns empty query dict
I think you need to tune your url to accept required or optional args or kwargs
Django got you all the power you need with regrex like:
url(r'^project_config/(?P<product>\w+)/$', views.foo),
more about this at django-optional-url-parameters
- [Django]-How to pass multiple values for a single URL parameter?
- [Django]-How does one make logging color in Django/Google App Engine?
- [Django]-How do I run tests for all my Django apps only?
5๐
This is another alternate solution that can be implemented:
In the URL configuration:
urlpatterns = [path('runreport/<str:queryparams>', views.get)]
In the views:
list2 = queryparams.split("&")
- [Django]-Django Sitemaps and "normal" views
- [Django]-Choose test database?
- [Django]-POST jQuery array to Django
2๐
It seems more recommended to use request.query_params
. For example,
When a URL is like domain/search/?q=haha
, you would use request.query_params.get('q', None)
https://www.django-rest-framework.org/api-guide/requests/
"request.query_params is a more correctly named synonym for request.GET.
For clarity inside your code, we recommend using request.query_params instead of the Djangoโs standard request.GET. Doing so will help keep your codebase more correct and obvious โ any HTTP method type may include query parameters, not just GET requests."
- [Django]-Multiple Database Config in Django 1.2
- [Django]-Strings won't be translated in Django using format function available in Python 2.7
- [Django]-Django Rest Framework pagination extremely slow count
- [Django]-How to access Enum types in Django templates
- [Django]-With DEBUG=False, how can I log django exceptions to a log file
- [Django]-IOS app with Django
0๐
In Django, views gets the path resolved for you.
But other than that if you need to resolve the path you can use the resolve module
Ex โ the requestedPath is โ domain/search/?userName=myUserName
or domain/search/<userName>/product/<productName>
from django.urls import resolve
resolveMatcher = resolve(request.path)
userName = resolveMatcher.kwargs.get('userName', None)
- [Django]-How to change User representation in Django Admin when used as Foreign Key?
- [Django]-How to use Django ImageField, and why use it at all?
- [Django]-Parsing unicode input using python json.loads
0๐
For example, if you access the url below:
https://example.com/?fruits=apple&meat=beef
Then, you can get the parameters in views.py
as shown below. *My answer explains how to get a GET
request valuesโ list in Django and my answer explains how to get POST
request values in Django:
# "views.py"
from django.shortcuts import render
def index(request):
print(request.GET['fruits']) # apple
print(request.GET.get('meat')) # beef
print(request.GET.get('fish')) # None
print(request.GET.get('fish', "Doesn't exist")) # Doesn't exist
print(request.GET.getlist('fruits')) # ['apple']
print(request.GET.getlist('fish')) # []
print(request.GET.getlist('fish', "Doesn't exist")) # Doesn't exist
print(request.GET._getlist('meat')) # ['beef']
print(request.GET._getlist('fish')) # []
print(request.GET._getlist('fish', "Doesn't exist")) # Doesn't exist
print(list(request.GET.keys())) # ['fruits', 'meat']
print(list(request.GET.values())) # ['apple', 'beef']
print(list(request.GET.items())) # [('fruits', 'apple'), ('meat', 'beef')]
print(list(request.GET.lists())) # [('fruits', ['apple']), ('meat', ['beef'])]
print(request.GET.dict()) # {'fruits': 'apple', 'meat': 'beef'}
print(dict(request.GET)) # {'fruits': ['apple'], 'meat': ['beef']}
print(request.META['QUERY_STRING']) # fruits=apple&meat=beef
print(request.META.get('QUERY_STRING')) # fruits=apple&meat=beef
return render(request, 'index.html')
Then, you can get the parameters in index.html
as shown below:
{# "index.html" #}
{{ request.GET.fruits }} {# apple #}
{{ request.GET.meat }} {# beef #}
{{ request.GET.dict }} {# {'fruits': 'apple', 'meat': 'beef'} #}
{{ request.META.QUERY_STRING }} {# fruits=apple&meat=beef #}
- [Django]-Pulling data to the template from an external database with django
- [Django]-Django REST framework post array of objects
- [Django]-Django โ How to set default value for DecimalField in django 1.3?