拥有真实能力的视图
接下来,我们在项目根目录下添加templates文件夹,并在templates文件夹下创建blogpost文件夹,再在blogpost文件夹下建立index.html
文件:
在index.html
中写入如下代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{ post.title }}</title>
</head>
<body>
<h1>{{ post.title }}</h1>
<em>{{ post.category }}</em>
<p>{{ post.content }}</p>
</body>
</html>
templates是我们的模板,要让django找到我们的模板,需要在blog/settings.py
模块中TEMPLATES
配置的'DIR':[]
中添加 os.path.join(BASE_DIR, 'templates')
,表示在项目的根目录下查找templates
文件夹。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
在blogpost/views.py
模块中编写如下代码:
from django.shortcuts import render
from django.http import HttpResponse
from .models import Blog
def index(request):
post = Blog.objects.all()[0]
return render(request, 'blogpost/index.html', {'post': post})
render
方法的第一个参数封装好了HTTP的请求,第二参数是所要使用的模板,第三参数是一个字典。它将从数据库中取出的数据传递给模板。
打开浏览器输入网址http://127.0.0.1:8000/blog/:
浏览器返回我们从数据库中取到的博客内容。
带参数的视图
首先进入后台,添加几条博客内容:
在views.py
模块中添加一个视图函数detail()
:
def detail(request, id):
post = Blog.objects.get(pk=id)
return render(request, 'blogpost/index.html', {'post': post})
接着在blogpost/urls.py
模块中添加URLconf:
urlpatterns = [
url(r'^detail/(?P<id>[0-9]+)/$', views.detail, name='detail'), # 添加代码
url(r'^$', views.index, name='index'),
]
这里的url模式匹配表示,在detail/
后至少跟一位数字,例如:detail/2/
或 detail/6/
都是正确的。(?P<id>[0-9]+)
部分表示捕获文本,它相当于上面例子中 id=2或6
,django通过浏览器捕获用户输入的参数,再将参数传递给视图函数,视图函数中的参数id
可以看做是def detail(request, id=2)
。打开浏览区输入如下地址:http://127.0.0.1:8000/blog/detail/3/(其中detail后的数字随意输入,但要保证文章id存在)。
404错误处理
在上面的例子中,我们如果在detail/
后输入一个不存在的id
值,浏览器将会爆出一堆错误,这非常影响我们的用户体验,因此,需要对页面异常进行捕获,
打开blogpost/views.py
模块,修改代码:
def detail(request, id):
#post = Blog.objects.get(pk=id)
post = get_object_or_404(Blog, pk=id)
return render(request, 'blogpost/detail.html', {'post': post})
get_object_or_404
是django捕获404异常页面的快捷方式,再次打开浏览器输入不存在的id地址,页面显示如下: