128

ここにあるチュートリアルに正確に従っていると、カスタムの 500 または 404 エラー ページを作成できません。間違った URL を入力すると、デフォルトのエラー ページが表示されます。カスタム ページが表示されないようにするために確認すべきことはありますか?

ファイル ディレクトリ:

mysite/
    mysite/
        __init__.py
        __init__.pyc
        settings.py
        settings.pyc
        urls.py
        urls.pyc
        wsgi.py
        wsgi.pyc
    polls/
        templates/
            admin/
                base_site.html
            404.html
            500.html
            polls/
                detail.html
                index.html
        __init__.py
        __init__.pyc
        admin.py
        admin.pyc
        models.py
        models.pyc
        tests.py
        urls.py
        urls.pyc
        view.py
        views.pyc
    templates/
    manage.py

mysite/settings.py 内で、これらを有効にしています。

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

TEMPLATE_DIRS = (
    'C:/Users/Me/Django/mysite/templates', 
)

mysite/polls/urls.py 内:

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
    url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
    url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)

必要な他のコードを投稿できますが、不適切な URL を使用した場合にカスタム 500 エラー ページを取得するには、何を変更すればよいですか?

編集

解決策: 追加の

TEMPLATE_DIRS

私のsettings.py内で、それが問題を引き起こしていました

4

15 に答える 15

135

メインの下views.pyに、次の 2 つのビューの独自のカスタム実装を追加し、テンプレート404.html500.htmlに表示したいものを設定するだけです。

このソリューションでは、カスタム コードを追加する必要はありません。urls.py

コードは次のとおりです。

from django.shortcuts import render_to_response
from django.template import RequestContext


def handler404(request, *args, **argv):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response


def handler500(request, *args, **argv):
    response = render_to_response('500.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 500
    return response

アップデート

handler404およびhandler500にあるエクスポートされた Django 文字列構成変数ですdjango/conf/urls/__init__.py。そのため、上記の構成が機能します。

上記の構成を機能させるには、ファイルで次の変数を定義しurls.py、エクスポートされた Django 変数を、これらの Django 機能ビューが定義されている場所の文字列 Python パスにポイントする必要があります。

# project/urls.py

handler404 = 'my_app.views.handler404'
handler500 = 'my_app.views.handler500'

Django 2.0 の更新

Django 2.0 でハンドラー ビューの署名が変更されました: https://docs.djangoproject.com/en/2.0/ref/views/#error-views

上記のようにビューを使用すると、handler404 は次のメッセージで失敗します。

「handler404() が予期しないキーワード引数 'exception' を取得しました」

そのような場合、ビューを次のように変更します。

def handler404(request, exception, template_name="404.html"):
    response = render_to_response(template_name)
    response.status_code = 404
    return response
于 2014-07-13T16:56:52.610 に答える
51

これらの行を urls.py に追加します

urls.py

from django.conf.urls import (
handler400, handler403, handler404, handler500
)

handler400 = 'my_app.views.bad_request'
handler403 = 'my_app.views.permission_denied'
handler404 = 'my_app.views.page_not_found'
handler500 = 'my_app.views.server_error'

# ...

そして、views.py にカスタム ビューを実装します。

ビュー.py

from django.shortcuts import (
render_to_response
)
from django.template import RequestContext

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

        response.status_code = 400

        return response

# ...
于 2015-10-26T10:03:48.697 に答える
23

あなたが参照したページから:

ビュー内から Http404 を発生させると、Django は 404 エラーの処理専用の特別なビューを読み込みます。これは、ルート URLconf で変数 handler404 を探して (ルート URLconf でのみ; handler404 を他の場所に設定しても効果はありません)、Python のドット付き構文の文字列です。通常の URLconf コールバックが使用するのと同じ形式です。404 ビュー自体は特別なものではなく、通常のビューです。

したがって、次のようなものを urls.py に追加する必要があると思います。

handler404 = 'views.my_404_view'

handler500 についても同様です。

于 2013-07-15T20:13:47.010 に答える
19

必要なことが、サイトの派手なエラー メッセージを含むカスタム ページを表示することだけである場合はDEBUG = False、テンプレート ディレクトリに 404.html と 500.html という名前の 2 つのテンプレートを追加すると、404 または 500 のときにこのカスタム ページが自動的に選択されます。上げられます。

于 2016-12-01T04:54:55.200 に答える
14

settings.py:

DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost']  #provide your host name

テンプレートフォルダー404.htmlにページを追加するだけです。投票アプリのテンプレートから500.html削除404.htmlします。500.html

于 2016-03-03T10:58:01.140 に答える
5

1 行として (404 汎用ページの場合):

from django.shortcuts import render_to_response
from django.template import RequestContext

return render_to_response('error/404.html', {'exception': ex},
                                      context_instance=RequestContext(request), status=404)
于 2015-05-04T13:07:33.583 に答える
3

エラー テンプレートを に移動してみてください.../Django/mysite/templates/

これについては確かですが、これらはウェブサイトに対して「グローバル」である必要があると思います。

于 2013-07-15T20:16:50.217 に答える