先在我们来自己布置一个404页面
from django.http import Http404
from django.shortcuts import render
def detail(request, r_id):
try:
poll=Register.objects.get(pk=r_id)
except Register.DoesNotExist:
raise Http404
return render(request,'jobs/detail.html',{'poll':poll})
然后在detail.html中加入{{poll}}即可
http://127.0.0.1:8009/jobs/+一个不存在的id就会引发404错误
一旦我们在视图中使用了render,这时就不再需要导入loader context HttpReponse了
一个更快捷的方式:get_object_or_404
from django.shortcuts import render, get_object_or_404
def detail(request, r_id):
poll=get_object_or_404(Register,pk=r_id)
return render(request,'jobs/detail.html',{'poll':poll})
这样子就比上面的代码简易多了,而且出现的效果也是一样的
还有个 get_list_or_404() 函数,与 get_object_or_404() 一样 – 不过执行的是 filter() 而不是 get() 。若返回的是空列表将抛出 Http404 异常。
自己编写404视图
当你在视图中抛出 Http404 时,Django 将载入一个特定的视图来处理 404 错误。Django 会根据你的 root URLconf ( 仅在你的 root URLconf 中;在其他任何地方设置 handler404 都无效 )中设置的 handler404 变量来查找该视图,这个变量是个 Python 包格式字符串 – 和标准 URLconf 中的回调函数格式是一样的。 404 视图本身没有什么特殊性:它就是一个普通的视图。
通常你不必费心去编写 404 视图。若你没有设置 handler404 变量,默认情况下会使用内置的 django.views.defaults.page_not_found() 视图。或者你可以在你的模板目录下的根目录中 创建一个 404.html 模板。当 DEBUG 值是 False ( 在你的 settings 模块中 ) 时, 默认的 404 视图将使用此模板来显示所有的 404 错误。 如果你创建了这个模板,至少添加些如“页面未找到” 的内容。
自己编写500视图
我们重新设置detail.html的页面
<h1>{{ poll.account }}</h1>
<h3>{{ poll.password }}</h3>
<ul>
{% for choice in poll.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
关于页面中的硬编码:
在index.html中我们有<li><a href="/jobs/{{ register.id }}/">{{ register.account }}</a></li>这样的代码,其中href="/jobs/{{ register.id }}即为硬编码,既然你在 polls.urls 模块中的 url() 函数中定义了 命名参数,那么就可以在 url 配置中使用 {% url %} 模板标记来移除特定的 URL 路径依赖:
<li><a href="{% url 'detail' register.id %}">{{ register.account }}</a></li>
注意:
如果 {% url 'detail' poll.id %} (含引号) 不能运行,但是 {% url detail poll.id %} (不含引号) 却能运行,那么意味着你使用的 Djang 低于 < 1.5 版。这样的话,你需要在模板文件的顶部添加如下的声明::
{% load url from future %}
练习熟练之后下一篇我们来研究一下关于Django的命名空间