django cms的自定义错误页面
当使用django cms时,服务器403/404/500错误页面可能是一个微不足道的任务。按照旧论坛帖子上的说明创建: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 =
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的版本 值得注意
- 删除请求中的当前页面缓存
- 设置
或请求。当前页面
将不会使用404页面并呈现为空cms\u标签
- 调用主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轻松编辑”。。。