Mix of Python and Django utility functions, classed etc.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
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, **kwargs):
|
|
|
|
view_args = []
|
|
|
|
view_kwargs = {'url_path': kwargs[list(kwargs.keys())[0]]}
|
|
|
|
|
|
|
|
not_found_exception = Http404
|
|
|
|
for view in views:
|
|
|
|
try:
|
|
|
|
return view(request, *view_args, **view_kwargs)
|
|
|
|
except Http404 as e:
|
|
|
|
not_found_exception = e # assign to use it outside of except block
|
|
|
|
continue
|
|
|
|
raise not_found_exception
|
|
|
|
|
|
|
|
return wrapper
|