When using DeleteView
mixin with success_url = reverse_lazy('www:media-list')
for a non-ASCII "delete URL" (e.g. /fr/médias/2139079220/Jules-Verne-cinq-semaines-en-ballon/suppression/ ) I get the following error :
Internal Server Error: /fr/médias/2139079220/Jules-Verne-cinq-semaines-en-ballon/suppression/
Traceback (most recent call last):
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/core/handlers/base.py", line 111, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/utils/decorators.py", line 29, in _wrapper
return bound_func(*args, **kwargs)
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/utils/decorators.py", line 25, in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2)
File "/opt/VENV/publiberty/publiberty/django/www/views.py", line 485, in dispatch
return super().dispatch(*args, **kwargs)
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/views/generic/base.py", line 87, in dispatch
return handler(request, *args, **kwargs)
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/views/generic/edit.py", line 259, in post
return self.delete(request, *args, **kwargs)
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/views/generic/edit.py", line 253, in delete
success_url = self.get_success_url()
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/views/generic/edit.py", line 263, in get_success_url
return self.success_url % self.object.__dict__
File "/opt/VENV/publiberty/lib/python3.4/site-packages/django/utils/functional.py", line 179, in __mod__
return six.text_type(self) % rhs
ValueError: unsupported format character 'C' (0x43) at index 6
For "normal" ASCII urls everything works fine.
Following workaround is working:
def get_success_url(self):
return reverse('www:media-list')
Could it be linked to the "accidental" fix of ticket 22693 ? I'm using Python 3.4.2 with Ubuntu 14.10.
I think that using the old percent-based interpolation method in
get_success_url
was not very wise, considering that%
is a common escape marker in URLs. I'd suggest using the newformat
interpolation method to elude conflicts with escaping percent characters in URLs.