On production server, when I try to edit/create an object then saving fails, returning 404. This only occurs for POST requests, GET requests (loading the page) work fine. Dj
I never got to the bottom of this, but I have developed a workaround that allows the forms to function.
Edit _get_response(self, request)
in django.core.handlers.base
. Change resolver_match = resolver.resolve(request.path_info)
to resolver_match = resolver.resolve(request.path)
.
Add this middleware (adjust to your exact needs):
class ImageField404Middleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
if (request.method == 'POST' and request.user.is_superuser and response.status_code == 302
and request.get_full_path().startswith('/pathtoadmin/')):
post_messages = get_messages(request)
for message in post_messages:
if ('was added successfully' in message.message or 'was changed successfully' in message.message
and message.level == message_levels.SUCCESS):
messages.success(request, message.message)
redirect_url = request.get_full_path()
if '_addanother' in request.POST:
redirect_url = re.sub(r'[^/]*/[^/]*/$', 'add/', redirect_url)
elif '_save' in request.POST:
redirect_url = re.sub(r'[^/]*/[^/]*/(\?.*)?$', '', redirect_url)
if '_changelist_filters' in request.GET:
preserved_filters = parse.parse_qsl(request.GET['_changelist_filters'])
redirect_url += '?' + parse.urlencode(preserved_filters)
elif '_continue' in request.POST:
redirect_url_search = re.search(r'((?<=href=)[^>]*)', message.message)
if redirect_url_search:
redirect_url = redirect_url_search.group(0)
redirect_url = re.sub(r'[\\"]*', '', redirect_url).replace('/pathtoadmin/pathtoadmin/', '/pathtoadmin/')
return HttpResponseRedirect(redirect_url)
return response
Not ideal by any means, but works for me at the moment.
I believe these problems may, in part at least, be caused by ModSecurity Apache. Some problems I had went away after the hosting provider later reconfigured this.
You can read more details here: https://medium.com/@mnydigital/how-to-resolve-django-admin-404-post-error-966ce0dcd39d
Have you activated middleware (Internationalization: in URL patterns)?
# settings.py
MIDDLEWARE = [
...
'django.middleware.locale.LocaleMiddleware'
...
]