2013-09-30 5 views
8

Предположительно тривиальная задача для страниц ошибок сервера 403/404/500 при использовании django-cms. Круги инструкция на старом форуме сообщении, чтобы создать это:Пользовательские страницы ошибок для 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' 
... 

От отслеживающего Джанго СХ не может найти страницу 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 с помощью slug: 'page-not-found'. Мне что-то не хватает? Работает на производственном сервере с debug=False. Запуск django-cms 2.4.2 (изменить)

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

ответ

9

Походив в бесчисленные стены над мыслящие вопросы, я просто пошел с использованием основных 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-адресов для таблицы стилей ,

Проблема решена. Потратил кучу времени на что-то такое тривиальное.

+0

Где вы положили этот фрагмент кода? В представлении? – Dave

+2

В адресах.py file – mrkre

+0

На самом деле, существует реальное решение для вашего исходного вопроса. даже два из них, старый, который работал бы, когда был задан ваш вопрос (как я обновлял устаревшую систему), и супер легкую версию django-cms> 3.0. Я думаю, что стоит иметь «404, который легко редактируется через cms вашими пользователями/редакторами» ... – benzkji

3

Вот рабочая (с DEBUG в ИСТИНА или ЛОЖЬ) 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 
+0

на самом деле эта резолюция работает. НО обратите внимание, что вам нужно будет «вернуть response.render()» в другом, чтобы получить страницу –

0

EDIT/Easy решение

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

Original (до сих пор работает) Ответ

После борьбы обновления моего handler404 от старого проекта CMS, и не найдя никаких Infos на эту тему, и принятый ответ не является реальным решением проблемы, я исследовал и нашел версию, которая работает в django-cms 3.4.

Стоит отметить

  • удалить _current_page_cache по запросу
  • набора 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 
Смежные вопросы