File tree Expand file tree Collapse file tree 2 files changed +30
-1
lines changed Expand file tree Collapse file tree 2 files changed +30
-1
lines changed Original file line number Diff line number Diff line change @@ -52,12 +52,27 @@ def __init__(self):
5252 def register (self , prefix , viewset , basename = None ):
5353 if basename is None :
5454 basename = self .get_default_basename (viewset )
55- self .registry .append ((prefix , viewset , basename ))
55+
56+ if not self .basename_already_registered (basename ):
57+ self .registry .append ((prefix , viewset , basename ))
5658
5759 # invalidate the urls cache
5860 if hasattr (self , '_urls' ):
5961 del self ._urls
6062
63+ def basename_already_registered (self , new_basename ):
64+ """
65+ If `basename` is already registered, raise an exception
66+ """
67+ for route in self .registry :
68+ prefix , viewset , basename = route
69+ if new_basename == basename :
70+ msg = (f'Route with basename "{ new_basename } " is already registered. '
71+ f'Please provide a unique basename for viewset "{ viewset } "' )
72+ raise ImproperlyConfigured (msg )
73+
74+ return False
75+
6176 def get_default_basename (self , viewset ):
6277 """
6378 If `basename` is not specified, attempt to automatically determine
Original file line number Diff line number Diff line change @@ -481,3 +481,17 @@ def test_basename(self):
481481 initkwargs = match .func .initkwargs
482482
483483 assert initkwargs ['basename' ] == 'routertestmodel'
484+
485+
486+ class TestDuplicateBasename (URLPatternsTestCase , TestCase ):
487+ def test_exception_for_duplicate_basename (self ):
488+ class NoteViewSet (viewsets .ModelViewSet ):
489+ queryset = RouterTestModel .objects .all ()
490+
491+ self .router = SimpleRouter (trailing_slash = False )
492+ self .router .register (r'notes' , NoteViewSet )
493+
494+ with pytest .raises (ImproperlyConfigured ):
495+ self .router .register (r'notes_duplicate' , NoteViewSet )
496+
497+ self .router .register (r'notes_duplicate_2' , NoteViewSet , basename = 'note_duplicate' )
You can’t perform that action at this time.
0 commit comments