Django url pattern - string parameter
PythonRegexDjangoPython Problem Overview
Django url pattern that have a number parameter is:
url(r'^polls/(?P<poll_id>\d+)/$', 'polls.views.detail')
What will be the correct syntax if my poll_id is not a number but a string of character?
Python Solutions
Solution 1 - Python
for having a string parameter in url you can have: url like this:
url(r'^polls/(?P<string>[\w\-]+)/$','polls.views.detail')
This will even allow the slug strings to pass eg:strings like node-js etc.
Solution 2 - Python
In newer versions of Django such as 2.1 you can use
path('polls/<str:poll_id>', views.polls_detail)
as given here Django URL dispatcher
def polls_detail(request,poll_id):
#process your request here
Solution 3 - Python
Depends on what characters you care about. Like http://docs.python.org/library/re.html">the docs say, \w
will give you an alphanumeric character or an underscore.
Solution 4 - Python
Starting in Django 2.0 it is easier to handle string parameters in URLs with the addition of the slug symbol, which is used just like int in urls.py:
from django.urls import path
urlpatterns = [ path('something/<slug:foo>', views.slug_test),]
And in your function-based or class-based view you would handle it just like any other parameter:
def slug_test(request, foo):
return HttpResponse('Slug parameter is: ' + foo)
Solution 5 - Python
From Django 2.0 onward, path
has been introduced. path
does not take reg ex in urls, hence it is meant to be a simplified version of the older url
From 2.0 onward you can use path instead like below :
path('polls/<poll_id>', views.polls_detail)
string path parameters need not be explicitly specified, as default data type for path parameters is string itself.
Ref : https://docs.djangoproject.com/en/2.0/releases/2.0/#whats-new-2-0
Solution 6 - Python
If you are using Django version >= 2.0, then this is done simply like below.
from django.urls import path
urlpatterns = [ ... path('polls/<string>/$','polls.views.detail') ...]
Source: https://docs.djangoproject.com/en/2.0/ref/urls/#django.urls.path
Solution 7 - Python
In case your angle-bracket argument is a path, i.e. contains "/", you'll have to use path:
.
Example:
path('section/<path:some_path>,app.views.some_view,name='some_name')
Source: https://docs.djangoproject.com/en/4.0/topics/http/urls/#path-converters
(EDITED)
"str - Matches any non-empty string, EXCLUDING the path separator, '/'. This is the default if a converter isn’t included in the expression.
slug - Matches any slug string consisting of ASCII letters or numbers, plus the hyphen and underscore characters. For example, building-your-1st-django-site.
path - Matches any non-empty string, INCLUDING the path separator, '/'. This allows you to match against a complete URL path rather than a segment of a URL path as with str."