47

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'),

2 Answers 2

84
('^(?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.

Sign up to request clarification or add additional context in comments.

3 Comments

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
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.
More info about this in the official docs.
1

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.