﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
31069	Change in behavior for optional re matches.	Terence Honles	Hasan Ramezani	"I am mainly pointing this out as it probably should have been called out as a breaking change from Django 2.X to 3.X (And I think the release notes should probably be adjusted if the old functionality is not to be restored). You can probably argue either way about if this is a bug since it's coming from re's `match.groupdict()`. It's related to https://code.djangoproject.com/ticket/31061 and caused by https://code.djangoproject.com/ticket/26431 / https://github.com/django/django/pull/11477

The test is the following:


{{{
from django.urls import re_path

def view(request, optional1, optional2): ...

urlpatterns = [
  re_path(r'^(?P<optional1>\w+/)(?:(?P<optional2>\w+)/)?', view)
]
}}}

For Django 2.X this would work as expected because named captures are returned even if they are `None`, however in Django 3.0 this would raise an error because positional parameter `optional2` is no longer provided. (i.e. `view() missing 1 required positional argument: 'optional2'`)

You can argue that `optional2` should actually have had a default all along, but it didn't before and code may unexpectedly break because it is now required.

I'm not very familiar with https://code.djangoproject.com/ticket/26431, but I think if possible it probably should have been fixed at a different level."	Bug	closed	Documentation	3.0	Normal	fixed			Accepted	1	0	0	0	0	0
