django 搭建一个投票类网站(三)
之前修改index的视图的代码,工作原理是先试用loader方法加载视图,然后HTTPResponse方法初始化一个HTTPResponse对象并返回给浏览器。对于很多django视图来说,他们的工作原理是这样的,因此django写了一个简写函数render。下面使用render函数重写index视图,
from django.shortcuts import render from django.http import HttpResponse from .models import Question from django.template import loader def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {
'latest_question_list': latest_question_list,
}
return render(request,'polls/index.html',context)
然后重新访问index,会发现什么都没发生变化。
引用render包之后,代码中讲不需要loader和HttpResponse包
1.处理404错误
404错误一般是跳转时页面不存在时所显示的错误。下面修改detail视图使其在被查找的问卷不存在时抛出404错误,在polls/views输入以下代码
from django.shortcuts import render from django.http import Http404 from .models import Question def detail(request, question_id):
try:
question = Question.objects.get(pk=question_id)
except Question.DoesNotExist:
raise Http404("问卷不存在")
return render(request, 'polls/detail.html' , {'question': question})
然后重启web服务,访问一个不存在的问卷,比如http://127.0.0.1:8000/polls/10,然后会显示这样的界面

由于404错误也是一个非常常见的网络异常,所以django也提供了一个简写方法:get_object_or_404。也可以用这个方法来修改detail视图
2.使用模板系统
前面的模板过于简单,现实中django的模板系统十分强大。下面创建一个detail.html,然后复制以下代码到这里面
<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>
(解释下这段代码,{%%}这种新式的代码是django模板语言中的函数语法,for choice这条就是一个for循环,循环对象是question.choice_set.all,该对象等价于python中的question.choice_set.all,返回一个可遍历数组,然后对应的要在结尾上加上{%endfor%}表示循环结束)
然后输入正确的url可以看到,对应的问卷名字被加粗显示出来了
·
在index.html文件里,我们用硬编码的形式,编写了html超链接(<a href="/polls/{{question.id}}/">{{question.question_text }}</a>)。当项目有很多模板,并且多个模板都使用了同一个url时,那么这种url书写方式在修改时会带来很多不必要的工作量,不过可以通过url的命名方式改解决这个问题
url中的代码是这样的path('<int:question_id>',views.detail, name='detail'),然后修改html里的代码,改成这样<a href=" {% url 'detail' question.id %}">{{question.question_text }}</a>
其中{%url%}是django里的模板标签,用于定义url。该标签会在polls/urls模块中查询detail的url,如果需要传递多个参数,只要在question.id后面紧跟一个空格然后继续添加参数即可
可是当存在很多detail视图的时候该怎么分辨呢,可以为url添加命名空间的方式解决问题。
在polls/urls下修改代码,添加app_name参数

然后修改index.html里的内容

django 搭建一个投票类网站(三)的更多相关文章
- django 搭建一个投票类网站(二)
前一篇讲了创建一个工程和一个polls的应用程序,以及配置了数据库. 这篇就继续讲吧 1.django admin模块 admin模块是django自带的模块,他让开发者可以不用管写任何代码的情况下就 ...
- django 搭建一个投票类网站(一)
写在最前,之前零零散散的看过django,但是由于比较杂,学的云里雾里的,所以就停了一段落,但是我最近找到了一个django的书,是李建编著的django入门与实践,于是,打算照着书上的步骤来写好一个 ...
- django 搭建一个投票类网站(四)
昨天我把投票页面终于写完,怎么说呢,觉得这本书对我的帮助也不是很大,然后去看了下django的文档,发现竟然是同一个项目...... 但还是要善始善终吧,贴一下中文版的文档https://docs.d ...
- 初学django搭建一个通讯录应用
---恢复内容开始--- django搭建一个通讯录应用 一.环境介绍 window10 64位 Django-1.5.12 python 2.7 Sqlite3 二.基本安装 python2.7安装 ...
- 利用django创建一个投票网站(三)
创建你的第一个 Django 项目, 第三部分 这一篇从第二部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,并且聚焦于如何创建公用界面--也被称为"视图". 设计哲学 Dj ...
- 利用django创建一个投票网站(五)
创建你的第一个 Django 项目, 第五部分 这一篇从第四部分(en)结尾的地方继续讲起.我们在前几章成功的构建了一个在线投票应用,在这一部分里我们将其创建一些自动化测试. 自动化测试简介 自动化测 ...
- 利用django创建一个投票网站(四)
创建你的第一个 Django 项目, 第四部分 这一篇从第三部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,专注于简单的表单处理并且精简我们的代码. 编写一个简单的表单 让我们更新一下在上一个 ...
- 利用django创建一个投票网站(一)
这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...
- 用django搭建一个简易blog系统(翻译)(三)
06. Connecting the Django admin to the blog app Django 本身就带有一个应用叫作Admin,而且它是一个很好的工具 在这一部分,我们将要激活admi ...
随机推荐
- 服务器CentOS7上安装MySql
1.确保服务器系统处于最新状态 [root@localhost ~]# yum -y update如果显示以下内容说明已经更新完成Replaced:grub2.x86_64 1:2.02-0.64.e ...
- 【MySql】数据库连接异常:Thelastpacketsentsuccessfullytotheserverwas0millisecondsago
参考链接:http://blog.sina.com.cn/s/blog_7540bf5f0102xjpk.html 最近新入职,用了新版的mysql8数据库,结果连接数据库时出现了问题,报了几个异常, ...
- 小白的java学习之路 “ 循环结构(二)”
一.for 循环 语法: for(表达式一;表达式二;表达式三){ 循环操作 } 表达式一:参数初始化 表达式二:条件判断 表达式三:更新循环变量 执行流程: 步骤一:执行表达式一.初始化参数 步骤二 ...
- Python函数进阶:闭包、装饰器、生成器、协程
返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包 ...
- docker镜像alpine封装nginx1.16.1【dockerfile】
github地址:https://github.com/laileman/Docker/Dockerfile/alpine-nginx1.16.1 1-目录结构 2- dockerfile内容 3- ...
- P1339 热浪【最短路】
#include <bits/stdc++.h> #define dbg(x) cout << #x << "=" << x < ...
- 替换 MyEclipse 中已有的项目
一.删除 tomcat 中的项目 1.停止 tomcat 2.删除 tomcat 中的项目 选中项目,然后右键 - Remove deployment,这个可能需要一点时间 二.删除 MyEclips ...
- cURL error 60: SSL certificate problem: unable to get local issuer certificate 解决方法
微信开发的时,请求接口报错如下: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see ...
- 《深入理解java虚拟机》读书笔记六——第七章
第七章 虚拟机类加载机制 1.类加载的时机 虚拟机的类加载机制: 虚拟机把描述类的数据从class文件中加载到内存,并对数据进行校验.转换解析和初始化,最终形成了可以被虚拟机直接使用的Java类型,这 ...
- Linux运维---16. Kolla部署OpenStack外接rabbit集群
# 前提时rabbit集群已经搭建完成 vim /etc/kolla/globals.yml enable_rabbitmq: "no" rpc_transport_url: &q ...