Making a Regex Django URL Token Optional

30,657

Solution 1

('^(?P<first_name>[a-zA-Z]+)/(?P<last_name>[a-zA-Z]+)(?:/(?P<title>[a-zA-Z]+))?/$','some_method'),

Don't forget to give title a default value in the view.

Solution 2

In case your are looking for multiple optional arguments, without any required ones, just omit "/" at the beginning, such as:

re_path(r'^view(?:/(?P<dummy1>[a-zA-Z]+))?(?:/(?P<dummy2>[a-zA-Z]+))?(?:/(?P<dummy3>[a-zA-Z]+))?/$', views.MyView.as_view(), name='myname'),

which you can browse at:

http://localhost:8000/view/?dummy1=value1&dummy2=value2&dummy3=value3
Share:
30,657

Related videos on Youtube

Federer
Author by

Federer

Updated on October 03, 2020

Comments

  • Federer
    Federer almost 4 years

    You have a URL which accepts a first_name and last_name in Django:

    ('^(?P<first_name>[a-zA-Z]+)/(?P<last_name>[a-zA-Z]+)/$','some_method'),
    

    How would you include the OPTIONAL URL token of title, without creating any new lines. What I mean by this is, in an ideal scenario:

    #A regex constant
    OP_REGEX = r'THIS IS OPTIONAL<title>[a-z]'
    #Ideal URL
    ('^(?P<first_name>[a-zA-Z]+)/(?P<last_name>[a-zA-Z]+)/OP_REGEX/$','some_method'),
    

    Is this possible without creating a new line i.e.

    ('^(?P<first_name>[a-zA-Z]+)/(?P<last_name>[a-zA-Z]+)/(?P<title>[a-zA-Z]+)/$','some_method'),
    
  • Federer
    Federer over 14 years
    thanks for that. How would I make a URL of JUST optional 'titles'? i.e. (?:/(?P<title1>[a-zA-Z]+))?(?:/(?P<title2>[a-zA-Z]+))? thanks for any help
  • Chris
    Chris over 11 years
    Note that the ?: is important in the outer group. Without it, the URL will work properly when navigated to, but reverse() won't notice the argument inside.
  • srus
    srus over 7 years
    More info about this in the official docs.