之前修改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. disabled属性对form表单提交的影响

    在form表单里,如果对input加入disabled="disabled"或disabled="true"等属性,form表单提交的时候,就不会传值到后台. ...

  2. (转)jvm具体gc算法介绍标记整理--标记清除算法

    转自:https://www.cnblogs.com/ityouknow/p/5614961.html GC算法 垃圾收集器 概述 垃圾收集 Garbage Collection 通常被称为“GC”, ...

  3. pyqt5-字体,颜色选择对话框设置label标签字体颜色样式

    1.采用实例方法,先创建2个dialog对象,采用该对象的信号触发相应的操作 import sys from PyQt5.Qt import * class MyWidget(QWidget): de ...

  4. HTML5创建高德地图

    创建高德地图 功能真的很好很强大,有图有证据! 1.申请key值 去官网2.https://webapi.amap.com/maps?v=1.4.11&key=e22196035aaa10db ...

  5. node-express处理表单的接口

    写一个小接口,用postman测试接口是否可行

  6. C#从委托、lambda表达式到linq总结

    前言 本文总结学习C#必须知道的基础知识,委托.监视者模式.常用lambda表达式.linq查询,自定义扩展方法,他们之间有什么关系呢?匿名委托是如何演变成lambda表达式,lambda再如何导出l ...

  7. 在Django中使用Sentry(Python 3.6.8 + Django 1.11.20 + sentry-sdk 0.13.5)

    1. 安装Sentry pip install sentry-sdk==0.13.5 2.在settings.py中配置 sentry_sdk.init( dsn="https://**** ...

  8. IIS7配置asp程序

    Windows 中IIS7.IIS7.5是默认不安装的,所以在安装完Windows Vista/windows 7/windows 2008之后如果需要安装IIS7/iis7.5的话,就要自己动手了. ...

  9. pygame 运行心理学问卷

    import pygame import sys from pygame.locals import * # wait for keys to putdown def waitForKeys(keys ...

  10. Python函数装饰器

    装饰器的原则 1)不修改被修饰函数的源代码: 2)不修改被修饰函数的调用方式: 装饰器的知识点 = 高阶函数 + 函数嵌套 + 闭包 1. 只用高阶函数写装饰器--->有瑕疵 import ti ...