2 changed files with 34 additions and 0 deletions
@ -0,0 +1,33 @@ |
|||||||
|
from django.http import Http404 |
||||||
|
|
||||||
|
|
||||||
|
def dispatch_slug_path(*views): |
||||||
|
""" |
||||||
|
Dispatch full path slug in iterating through a set of views. |
||||||
|
Http404 exceptions raised by a view lead to trying the next view |
||||||
|
in the list. |
||||||
|
|
||||||
|
This allows to plug different slug systems to the same root URL. |
||||||
|
|
||||||
|
Usages:: |
||||||
|
|
||||||
|
# in urls.py |
||||||
|
path('<slug:slug_path>/', dispatch_slug_path( |
||||||
|
views.CategoryDetailView.as_view(), |
||||||
|
views.ArticleDetailView.as_view())), |
||||||
|
) |
||||||
|
""" |
||||||
|
def wrapper(request, slug_path): |
||||||
|
args = [] |
||||||
|
kwargs = {'slug_path': slug_path} |
||||||
|
|
||||||
|
not_found_exception = Http404 |
||||||
|
for view in views: |
||||||
|
try: |
||||||
|
return view(request, *args, **kwargs) |
||||||
|
except Http404 as e: |
||||||
|
not_found_exception = e # assign to use it outside of except block |
||||||
|
continue |
||||||
|
raise not_found_exception |
||||||
|
|
||||||
|
return wrapper |
Loading…
Reference in new issue