2015-04-08 72 views
0

我是Django和Python的初學者。我正在嘗試爲我的學習創建一個簡單的博客。我想確保何時數據庫無法訪問,那麼網頁顯示404模板。下面是我的views.py文件,但我不斷收到500模板。Django分頁錯誤處理

from django.shortcuts import render 
from django.http import Http404 
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 
from blog.models import Post, About 

def index(request): 
global posts 
try: 
    all_blog_posts = Post.objects.all() 
    published_blog_posts = all_blog_posts.filter(published=True) 
except Post.DoesNotExist: 
    raise Http404('No Posts.') 

paginator = Paginator(published_blog_posts, 1) 

page = request.GET.get('page') 
try: 
    posts = paginator.page(page) 
except PageNotAnInteger: 
    posts = paginator.page(1) 
except EmptyPage: 
    posts = paginator.page(paginator.num_pages) 

try: 
    about = About.objects.get(id=1) 
except About.DoesNotExist: 
    raise Http404('No About.') 

context = {'posts': posts, 'about': about} 
return render(request, 'blog/index.html', context) 

如果我把調試上,然後我得到下面的異常值ProgrammingError,

relation "blog_post" does not exist 
LINE 1: ...post"."post_author", "blog_post"."published" FROM "blog_post... 

我認爲分頁是試圖在數據庫上運行原始查詢,但無法找到該表作爲數據庫無法達到。我可能在這裏錯了。

我的models.py是,

from django.db import models 

class Post(models.Model): 
created = models.DateTimeField(auto_now_add=True) 
updated = models.DateTimeField(auto_now=True) 
post_title = models.CharField(max_length=64) 
post_body = models.TextField() 
post_author = models.CharField(max_length=16) 
published = models.BooleanField() 

class About(models.Model): 
summary = models.TextField() 
github_url = models.URLField(max_length=200) 
twitter_url = models.URLField(max_length=200) 
linkedin_url = models.URLField(max_length=200) 
created = models.DateTimeField(auto_now_add=True) 
updated = models.DateTimeField(auto_now=True) 

我的urls.py是

from django.conf.urls import patterns, url 
from blog import views 

urlpatterns = patterns('', 
url(r'^$', views.index, name='index'), 
) 

的應用程序的名稱是博客。我正在使用Django 1.8和Python 2.7.6。任何幫助將不勝感激。

回答

1

您沒有創建數據庫。 你需要運行:

python manage.py migrate 

同步您的數據庫,並創建表

看看關於這個命令的文檔:https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-migrate

這不是一致扔404,如果沒有創建數據庫,但如果你真的想這樣做,你可以捕獲任何異常,而不是隻捕獲DoesnotExist,但我不建議這樣做:

try: 
    all_blog_posts = Post.objects.all() 
    published_blog_posts = all_blog_posts.filter(published=True) 
except: 
    raise Http404('No Posts.') 

有這個代碼,你可以根據你的404拋出,即使數據庫根本沒有創建:https://gist.github.com/rctay/527113

+0

我想要網站拋出404即使數據庫根本不存在。這就是爲什麼我沒有創建數據庫。 – SGL

+0

這與HTTP的標準不一致,明確指出404代表未找到頁面:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10。html 但是,如果你想這樣做,你可以簡單地捕獲任何異常(不僅DoesnotExist)並拋出404 – danielfranca

1

你試圖做的是一個極不可能的情況與Django的數據庫遷移是一部分「通常的部署堆棧」。但如果這是你真的要做的事情,那麼可以這樣做(雖然它不是初學者級別的任務)。 你想要做的是創建一個自定義中間件(https://docs.djangoproject.com/en/1.8/topics/http/middleware/#process-exception),它將查找ProgrammingError和RegEx匹配消息(因爲可能有其他的ProgrammingError)。 中間件應返回HttpResponseNotFound(https://docs.djangoproject.com/en/1.8/ref/request-response/#django.http.HttpResponseNotFound

一旦你的中間件是準備好了,把它添加到您的settings.pyMIDDLEWARE_CLASSEShttps://docs.djangoproject.com/en/1.8/topics/http/middleware/#activating-middleware)。您可能想將其放在列表的最底部,因爲MiddleWare在異常處理時執行順序相反enter image description here(圖片來自http://irisbeta.com/article/245366784/the-django-request-response-cycle/?ref&page=user&option=1048576&sort=recent&pageNum=1

玩得開心!