之前修改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 搭建一个投票类网站(三)的更多相关文章

  1. django 搭建一个投票类网站(二)

    前一篇讲了创建一个工程和一个polls的应用程序,以及配置了数据库. 这篇就继续讲吧 1.django admin模块 admin模块是django自带的模块,他让开发者可以不用管写任何代码的情况下就 ...

  2. django 搭建一个投票类网站(一)

    写在最前,之前零零散散的看过django,但是由于比较杂,学的云里雾里的,所以就停了一段落,但是我最近找到了一个django的书,是李建编著的django入门与实践,于是,打算照着书上的步骤来写好一个 ...

  3. django 搭建一个投票类网站(四)

    昨天我把投票页面终于写完,怎么说呢,觉得这本书对我的帮助也不是很大,然后去看了下django的文档,发现竟然是同一个项目...... 但还是要善始善终吧,贴一下中文版的文档https://docs.d ...

  4. 初学django搭建一个通讯录应用

    ---恢复内容开始--- django搭建一个通讯录应用 一.环境介绍 window10 64位 Django-1.5.12 python 2.7 Sqlite3 二.基本安装 python2.7安装 ...

  5. 利用django创建一个投票网站(三)

    创建你的第一个 Django 项目, 第三部分 这一篇从第二部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,并且聚焦于如何创建公用界面--也被称为"视图". 设计哲学 Dj ...

  6. 利用django创建一个投票网站(五)

    创建你的第一个 Django 项目, 第五部分 这一篇从第四部分(en)结尾的地方继续讲起.我们在前几章成功的构建了一个在线投票应用,在这一部分里我们将其创建一些自动化测试. 自动化测试简介 自动化测 ...

  7. 利用django创建一个投票网站(四)

    创建你的第一个 Django 项目, 第四部分 这一篇从第三部分(zh)结尾的地方继续讲起.我们将继续编写投票应用,专注于简单的表单处理并且精简我们的代码. 编写一个简单的表单 让我们更新一下在上一个 ...

  8. 利用django创建一个投票网站(一)

    这是教程的原始链接:http://django-intro-zh.readthedocs.io/zh_CN/latest/part1/ 创建你的第一个 Django 项目, 第一部分 来跟着实际项目学 ...

  9. 用django搭建一个简易blog系统(翻译)(三)

    06. Connecting the Django admin to the blog app Django 本身就带有一个应用叫作Admin,而且它是一个很好的工具 在这一部分,我们将要激活admi ...

随机推荐

  1. 2019sdqdCSP-J游记

    特别鸣谢:Miku -------------------------- 中午上了车,和ljx坐在一块.太阳是多么好啊,我们在看着刚出的tg题,cmz找不到了准考证,sbl在临时打印准考证 等到好不容 ...

  2. BZOJ #2989. 数列 [树套树]

    考虑转化问题模型,这个没必要可持久化,直接加点就可以了,还不用删点 每次的问题是求 曼哈顿距离,变成切比雪夫距离然后求解 然后我们考虑将这玩意旋转 45度, 然后原坐标的 \((x,y)\) 会变成 ...

  3. LeetCode 145. 二叉树的后序遍历 (用栈实现后序遍历二叉树的非递归算法)

    题目链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/ 给定一个二叉树,返回它的 后序 遍历. 示例: 输入: [ ...

  4. PIE-SDK For C++矢量数据的投影转换

    1.功能简介 目前在地理信息领域中数据包括矢量和栅格两种数据组织形式,每一种数据都可以对投影进行转换,目前PIE SDK支持矢量和栅格数据的投影转换功能,下面对矢量数据的投影转换功能进行介绍. 2.功 ...

  5. HTML5视频(自定义视频播放器源码)

    video对象 兼容情况: safari浏览器不支持webm格式 Chrome浏览器支持webm格式 ie8以及以下不支持video标签 , ie9支持video标签 ,但是支持mp4格式的 Fire ...

  6. Easyui-Treegrid使用注意事项-sunziren

    版权声明:本文为sunziren原创文章,博客园首发,转载务必注明出处以及作者名称. 最近,工作中有一个网页需要用到前端框架easyui的treegrid组件,因此我对这个treegird研究了一段时 ...

  7. 剑指offer-面试题14-剪绳子-贪婪算法

    /* 题目: 给定一个长度为n的绳子,把绳子剪为m段,(n>1,m>1) 求各段绳子乘积的最大值. */ /* 思路: 贪婪算法. 当绳子的长度大于5时,尽可能多的剪长度为3的绳子:当剩下 ...

  8. 忽略npm install安装失败信息

    在package.json目录下运行npm install命令时会提示某些模块安装失败,如下图所示:   不管你在.npmrc文件中设置了proxy.https-proxy和registry地址,它还 ...

  9. PWA - Manifest

    manifest 在一个JSON文本文件中提供有关应用程序的信息(如名称,作者,图标和描述) manifest 的目的是将Web应用程序安装到设备的主屏幕 部署一个 manifest <link ...

  10. PAT (Basic Level) Practice (中文)1016 部分A+B (15 分)

    正整数 A 的“D​A​​(为 1 位整数)部分”定义为由 A 中所有 D​A​​ 组成的新整数 P​A​​.例如:给定 8,D​A​​=6,则 A 的“6 部分”P​A​​ 是 66,因为 A 中有 ...