Пользовательские страницы ошибок для django-cms

предположительно тривиальная задача для сервера 403/404/500 страниц ошибок при использовании django-cms. Следуйте инструкциям на старом форуме, чтобы создать это:

from cms.views import details

def custom_404(request):
    response = details(request, 'page-not-found')
    response.status_code = 404
    return response
...

Urls.py имеет некоторые строки, как это:

handler404 = 'error_pages.views.custom_404'
...

из traceback django cms не может найти страницу 404:

File "/home/username/.virtualenvs/venv/lib/python2.7/site-packages/cms/views.py", line 22, in _handle_no_page
    raise Http404('CMS: Page not found for "%s"' % slug)

Http404: CMS: Page not found for "page-not-found"

очевидно, добавлены необходимые пользовательские страницы в django-cms со слизняком: "страница-не найдена". Я упускаю что-то очевидное? Запуск на рабочем сервере с debug=False. Бегущий django-cms 2.4.2 (правка)

возможно, лучше просто обслуживать простые сообщения об ошибках с жестко закодированными таблицами стилей?

3 ответов


после того, как я вошел в бесчисленные стены, обдумывая проблемы, я просто пошел с использованием основных обработчиков 403/404/500:

from django.utils.functional import curry
from django.views.defaults import *
handler500 = curry(server_error, template_name='500.html')
handler404 = curry(page_not_found, template_name='404.html')
handler403 = curry(permission_denied, template_name='403.html')

создал шаблоны для каждой ошибки и поместил абсолютные URL-адреса для таблиц стилей.

проблема решена. Потратил кучу времени на такую ерунду.


вот рабочий (с DEBUG при True или False) обработчик 404:

def handler404(request):
    if hasattr(request, '_current_page_cache'):
        delattr(request, '_current_page_cache')

    response = details(request, '404')
    response.status_code = 404
    return response

редактировать / простое решение

после большего поиска и мышления более простым решением было бы создать стандарт по умолчанию/standard 404.html, и в нем используйте статические заполнители django-cms...так же просто, как и получается!

оригинальный (все еще работает) ответ

после борьбы с обновлением моего handler404 из старого проекта cms, и не найдя никакой информации по этой теме, и принятый ответ не является реальным решением проблемы, я исследовал и нашел версию, которая работает в django-cms 3.4.

отметить

  • удалить _current_page_cache на запрос
  • set request.current_page или cms_tags не будет использовать вашу страницу 404 и отображать пустую
  • вызовите основную cms details просмотр для рендеринга страницы
  • и, наконец, вызвать response.render() (как указано в комментариях)

вид

def handler404(request):
    if hasattr(request, '_current_page_cache'):  # we'll hit the cache otherwise
        delattr(request, '_current_page_cache')
    page = get_page_from_request(request, '404')
    request.current_page = page  # templatags seem to use this.
    response = details(request, '404')  # the main cms view
    if hasattr(response, 'render'):  # 301/302 dont have it!
        response.render()  # didnt know about this, but it's needed
    response.status_code = 404  # the obvious
    return response