自定义404 django模板

时间:2016-10-11 20:03:38

标签: python django

我试图在我的应用程序中自定义404错误页面。在搜索了许多可能的解决方案之后,我创建了一个404.html模板,添加了一个应该处理HTTP错误404并编辑了我的urls.py的方法。

但我想我做错了什么。我的日志提出了无效的语法错误,我无法解决它。

我的views.py:

# HTTP Error 400
def page_not_found(request):
    response = render_to_response('404.html',context_instance=RequestContext(request))
    response.status_code = 404

    return response

语法错误:

Traceback (most recent call last):
File "/.../myenv/lib/python3.4/site-packages/django/core/urlresolvers.py", line 393, in urlconf_module
return self._urlconf_module
AttributeError: 'RegexURLResolver' object has no attribute '_urlconf_module'
...
File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
File "/home/dcaled/work/portal-interface/portal/urls.py", line 12
handler404 = 'views.handler404'
              ^
SyntaxError: invalid syntax

有没有人知道发生了什么? 感谢。

更新 在@Alasdair建议之后,我做了一些修改和修复。错误已经停止。

现在,我的urls.py就像:

handler404 = 'views.page_not_found'

urlpatterns = [
    url(r'^$', views.home),]    

但在访问非现有页面时,我仍然无法获得自定义404.html。 而是加载默认页面,并显示以下消息:

&#34; 未找到

此服务器上找不到请求的URL / url / 404。&#34;

另外,我的settings.py:

DEBUG = False
ALLOWED_HOSTS = ['*']
TEMPLATE_DIRS = (os.path.join(BASE_DIR , 'portal/templates'),)

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

我的项目树:

├── fb_dev
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
│
└── portal
    ├── admin.py
    ├── forms.py
    ├── json
    ├── migrations
    ├── models.py
    ├── static
    ├── templates
    │   ├── 404.html
    │   └── portal
    │       ├── base.html
    │       ├── home.html
    ├── templatetags
    ├── urls.py
    └── views.py

3 个答案:

答案 0 :(得分:2)

几个月后,我重新审视了这个问题并确定了一个解决方案。这是答案:

a)我从 views.py 中删除了page_not_found方法。没有必要添加它。 Django自动获取并呈现404.html模板。

b)再一次,无需编辑 urls.py 。所以我删除了这一行:

handler404 = 'views.page_not_found'

c)此外,还需要修改 settings.py ,将DEBUG设置为FALSE

DEBUG = False

我删除了以下行:

TEMPLATE_DIRS = (os.path.join(BASE_DIR , 'portal/templates'),)

d)最后,我在portal/templates目录中创建了一个404.html模板。值得注意的是,自定义模板仅在放置在此目录中时才会呈现。

答案 1 :(得分:1)

handler404应该在urlpatterns之外。如果视图名为page_not_found,则应引用page_not_found,而不是handler404

handler404 = 'views.page_not_found'

urlpatterns = [
    url(r'^$', views.home),
]

但是,在您的情况下,您根本不需要自定义404处理程序。完全删除handler404行,默认page_not_found视图将呈现您的404.html模板。

答案 2 :(得分:0)

在遇到一些麻烦之后,rev解决方案运行良好。因此,请澄清一下:

要做的两件事是:

  • 404.html中添加一个your_app/template/404.html文件
  • 将DEBUG值设置为False

之后,Django将自动呈现您的模板。