【问题标题】:Custom Error Pages for django-cmsdjango-cms 的自定义错误页面
【发布时间】:2013-10-06 02:00:15
【问题描述】:

可能是使用 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'
...

从 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 中使用 slug 添加了所需的自定义页面:'page-not-found'。我错过了什么明显的东西吗?使用debug=False 在生产服务器上运行。运行 django-cms 2.4.2(编辑)

用硬编码的样式表提供普通的错误消息可能会更好?

【问题讨论】:

    标签: django django-cms


    【解决方案1】:

    在无数次思考问题后,我只是使用基本的 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。

    问题解决了。浪费了很多时间在这么琐碎的事情上。

    【讨论】:

    • 实际上,您的原始问题有一个真正的解决方案。甚至其中两个,一个旧的,当你被问到问题时(因为我正在更新旧系统)会起作用,还有一个超级简单的 django-cms > 3.0 版本。我认为值得拥有一个“用户/编辑者可以通过 cms 轻松编辑的 404”...
    【解决方案2】:

    这是一个有效的(使用 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
    

    【讨论】:

    • 实际上这个分辨率是有效的。但请注意,您必须“返回 response.render()”才能获取页面
    【解决方案3】:

    编辑/简单的解决方案

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

    原始(仍在工作)答案

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

    值得注意

    • 删除请求中的_current_page_cache
    • 设置request.current_pagecms_tags将不会使用您的404页面并呈现为空
    • 调用主 cms details 视图来渲染页面
    • 最后,致电response.render()(如 cmets 中所述)

    观点

    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
    

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 1970-01-01
      • 2014-04-12
      • 2010-09-13
      • 2019-01-09
      • 2014-04-07
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多