2017-03-25 18 views
1

django 1.10を使用して私のカスタム404ページを作成するための簡単なdjangoアプリケーションを作成しました。 Django Documentationによると、私のページに404.htmlと500.htmlを作成しました。私は404エラーメッセージを表示する2つの方法を試しました。Django 404 Page not loading

1)私は単純な404.htmlと500.htmlページを作って何もしませんでした。 私は500ページを得ることに成功しました。 正しいURLは次のとおりでした:localhost:8000/book そして私はlocalhost:8000/book/fgfgを提供しました そして入力に応じてエントリがありませんでした。しかし、私は500ページに送られましたが404ページには送られませんでした私の期待通りに。 これは、内部のAppのUrls.pyです:

from django.conf.urls import url 
from django.conf.urls import (
handler400, handler403, handler404, handler500 
) 
from bookform import views 
from . import views 
urlpatterns = [ 
url(r'^$', views.index, name='index'),] 

そして、これは外部プロジェクトのurls.pyです:

from django.conf.urls import url,include,handler404,handler500 
from django.contrib import admin 


urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^book/', include('bookform.urls')), 
] 
# handler404='bookform.views.handler404' 
# handler500='bookform.views.handler500' 

私は第二の方法でコメント解除ここhandler404のと500をコメントしています。 最初の方法では、404と500のhtmlファイルを追加する以外は何もしませんでした.DjangoはURLを見つけようとしましたが、500のエラーが発生しましたが、404エラーであると予想していました。 Debugをtrueに設定すると、このエラーが表示されました: formdj.urlsで定義されたURLconfを使用して、Djangoは次のURLパターンをこの順序で試しました。 ^ admin/ ^ book/^ $ [name = 'index'] 現在のURL、book/dfsdfsdはこれらのいずれとも一致しませんでした。

DEBUG = FALSEに設定すると、500エラーになります。

2)方法2で: 私はviews.pyファイルを更新し、urls.pyからhandler404とhandler505行のコメントを外しました。

これはviews.py:

from django.shortcuts import render,render_to_response 
    from django.shortcuts import HttpResponse 
    from django.forms import modelformset_factory 
    from forms import BookForm 
    from bookform.models import Book 
    from django.template import RequestContext 
    def index(request): 

    BookFormSet=modelformset_factory(Book,fields= ('name','authors'),extra=10,can_delete=True) 
    formset=BookFormSet() 
    return render(request,'bookform/index.html',{'formset':formset}) 

    def handler404(request): 
    response = render(request,'bookform/404.html', {'status':400}, 
          ) 
    response.status_code = 404 
    print('I am getting called') 
    return response 
def handler500(request): 
    response = render(request,'bookform/500.html', {'status':400}, 
          ) 
    print('I am getting called 500') 
    response.status_code = 500 
    return response 

再び私は500 Page.Iは500とを削除しようとしましたなっていたデバッグ=その後、虚偽それは私がそれを言っていた、上でデバッグを有効500.Thenになりましたエラーは404エラーでした。 私が何をしたとしても、500.htmlというページがあります。 404.htmlページを正しく読み込む方法が混乱しています。

答えて

0

そのようなビュー試してみてください:urls.pyで、

from django.views.generic.base import TemplateView 

class Error404View(TemplateView): 
    template_name = '404.html' 

    def get(self, request, *args, **kwargs): 
     response = super(Error404View, self).get(request, *args, **kwargs) 
     response.status_code = 404 
     return response 

    @classmethod 
    def as_error_view(cls): 
     v = cls.as_view() 
     def view(request): 
      r = v(request) 
      r.render() 
      return r 
     return view 

よりを:

handler404 = Error404View.as_error_view() 
2

プロジェクトフォルダのurls.pyでアカウントが(それがどんなアプリでもよい)であるところ、これを追加同じプロジェクトのアプリ:

プロジェクト/ urls.py

アカウント/ビュー:アカウントの表示で= 'accounts.views.page_not_found'

handler404のは、これを追加します。PY

デフpage_not_found(リクエスト):

"" " ページが見つかりませんエラー404 """

 response = render_to_response('404.html',context_instance=RequestContext(request)) 
    response.status_code = 404 
    return response 

も良く、必要に応じて輸入を作ることを忘れhandler404の内容を追加しないでください 上記のURLパターン。また、ステージングでテストする際に、settings.pyでDebug = Falseを変更することを忘れないでください。