django cms的自定义错误页面

django cms的自定义错误页面,django,django-cms,Django,Django Cms,当使用django cms时,服务器403/404/500错误页面可能是一个微不足道的任务。按照旧论坛帖子上的说明创建: from cms.views import details def custom_404(request): response = details(request, 'page-not-found') response.status_code = 404 return response ... Urls.py有如下几行: handler404 =

当使用django cms时,服务器403/404/500错误页面可能是一个微不足道的任务。按照旧论坛帖子上的说明创建:

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'
...
从追溯到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中添加了所需的自定义页面,并带有slug:“未找到页面”。我错过了什么明显的东西吗?在生产服务器上以
debug=False
运行。运行django cms 2.4.2(编辑)


也许只使用硬编码样式表提供简单的ol错误消息更好?

在深入思考问题后,我选择使用基本的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

问题解决了。在这些琐碎的事情上浪费了大量时间。

下面是一个正在运行的404处理程序(调试为True或False):

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

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

编辑/简易解决方案

经过更多的搜索和思考,一个更简单的解决方案是创建默认/标准404.html,并在其中使用django cms静态占位符…尽可能简单

原始(仍有效)答案

在努力从旧cms项目中更新handler404之后,没有找到关于这个主题的任何信息,并且公认的答案不是问题的真正解决方案,我调查并找到了一个适用于django cms 3.4的版本

值得注意

  • 删除请求中的当前页面缓存
  • 设置
    请求。当前页面
    cms\u标签
    将不会使用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

实际上,这个决议是有效的。但请注意,为了获得页面,您必须“return response.render()”。实际上,对于您最初的问题,有一个真正的解决方案。即使是其中的两个,一个旧的,当你的问题被问到的时候(当我更新一个遗留系统时)也会起作用,还有一个超级简单的django cms>3.0版本。我认为值得拥有一个“404,用户/编辑可以通过cms轻松编辑”。。。