2016-10-11 17 views
1

私のアプリケーションで404エラーページをカスタマイズしようとしています。多くの可能な解決策を探した後、404.htmlテンプレートを作成し、HTTPエラー404を処理し、私のurls.pyを編集するメソッドを追加しました。カスタム404 djangoテンプレート

しかし、私は本当に間違っていると思います。私のログに無効な構文エラーがあり、解決できません。

私の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を得ることはありません。 代わりに、デフォルトのページでは、このメッセージを表示して、ロードされている: "

が要求されたURL/URL/404は、このサーバー上には見られないが見つかりませんでした"

また

、私の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 
+0

あなたはどのバージョンのDjangoを使用していますか?あなたの '404.html'テンプレートはどこにありますか? – Alasdair

+0

私のバージョンは1.8.5です。私はテンプレートの場所で質問を更新しました。 – revy

+0

'TEMPLATES'設定はありますか?あなたのコードの他の部分は、 'portal/templates'でテンプレートを検索できますか?あなたの[ブラウザ](http://stackoverflow.com/questions/2642340/django-404-page-not-showing-up)やサーバー(Apacheなど)が404ページをハイジャックしている可能性があります。 – Alasdair

答えて

2

数ヶ月後、私は問題を再訪し、解決策を特定しました。ここに答えがあります:

)私はviews.pyからpage_not_foundメソッドを削除しました。それを追加する必要はありません。 Djangoは404.htmlテンプレートを自動的に取得してレンダリングします。

b)もう一度、urls.pyを編集する必要はありません。だから私はこの行を削除:

handler404 = 'views.page_not_found' 

C)また、FALSEからDEBUGを設定settings.pyを編集する必要があります。

DEBUG = False 

そして、私は次の行を削除:

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

d)は最後に、私は私のportal/templatesディレクトリに404.htmlテンプレートを作成しました。カスタムテンプレートがレンダリングされたのは、このディレクトリ内に配置されている場合にのみレンダリングされたことに気付く価値があります

1

handler404は外urlpatternsでなければなりません。ビューがpage_not_foundと表示されている場合は、ではなく、page_not_foundを参照する必要があります。

handler404 = 'views.page_not_found' 

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

ただし、カスタム404ハンドラはまったく必要ありません。 handler404行を完全に削除すると、デフォルトのpage_not_foundビューで404.htmlテンプレートがレンダリングされます。

+0

はい、あなたは正しいです。私はこれらの変更を加えましたが、カスタマイズされた404ページはまだ表示されません。 「Not Found 要求されたURL/url/404がこのサーバに見つかりません」と表示されます。他のアイデア? – revy

+0

いいえ、実際にDEBUGはFalseです。 – revy