Django分页错误处理

时间:2015-04-08 05:53:09

标签: python django

我是Django和Python的初学者。我正在尝试为我的学习创建一个简单的博客。我想确保何时无法访问数据库,然后网页显示404模板。下面是我的views.py文件,但我一直在获得500个模板。

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。任何帮助将受到高度赞赏。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您尝试做的事情是django极不可能出现的情况,因为数据库迁移是"通常的部署堆栈的一部分"。

但是如果这是你真正开始做的事情,可以做到(虽然它不是初学者级别的任务)。 你想要做的是创建一个自定义中间件(https://docs.djangoproject.com/en/1.8/topics/http/middleware/#process-exception),它将寻找ProgrammingError和RegEx匹配消息(因为可能有其他ProgrammingError' s)。 中间件应返回HttpResponseNotFound(https://docs.djangoproject.com/en/1.8/ref/request-response/#django.http.HttpResponseNotFound

准备好中间件后,将其添加到settings.py MIDDLEWARE_CLASSEShttps://docs.djangoproject.com/en/1.8/topics/http/middleware/#activating-middleware)中的{{1}}。您可能希望将它放在列表的最底部,因为在涉及异常处理enter image description here时,MiddleWare以相反的顺序执行(来自http://irisbeta.com/article/245366784/the-django-request-response-cycle/?ref&page=user&option=1048576&sort=recent&pageNum=1的图片)

玩得开心!