在demo/views.py中添加这些代码:
  1. def detail(request, question_id):
  2. returnHttpResponse("You're looking at question %s."% question_id)
  3. def results(request, question_id):
  4. response ="You're looking at the results of question %s."
  5. returnHttpResponse(response % question_id)
  6. def vote(request, question_id):
  7. returnHttpResponse("You're voting on question %s."% question_id)
 
在demo/urls.py中加入如下代码,对应url的访问规则:
  1. from django.conf.urls import url
  2. from.import views
  3. urlpatterns =[
  4. # ex: /polls/
  5. url(r'^$', views.index, name='index'),
  6. # ex: /polls/5/
  7. url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
  8. # ex: /polls/5/results/
  9. url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
  10. # ex: /polls/5/vote/
  11. url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
  12. ]
 
为了让request做点什么事情,在demo/views.py中添加这些代码:
  1. from django.http importHttpResponse
  2. from.models importQuestion
  3. def index(request):
  4. latest_question_list =Question.objects.order_by('-pub_date')[:5]
  5. output =', '.join([q.question_text for q in latest_question_list])
  6. returnHttpResponse(output)
 
为了不让view层的代码hard-code,我们使用django的template功能,在demo下创建一个名为templates的文件夹
在其下polls/templates/polls/index.html放入代码:
  1. {%if latest_question_list %}
  2. <ul>
  3. {%for question in latest_question_list %}
  4. <li><a href="/demo/{{ question.id }}/">{{ question.question_text }}</a></li>
  5. {% endfor %}
  6. </ul>
  7. {%else%}
  8. <p>No polls are available.</p>
  9. {% endif %}
 
在demo/views.py中也要修改,可以获得template的内容:
  1. from django.http importHttpResponse
  2. from django.template import loader
  3. from.models importQuestion
  4. def index(request):
  5. latest_question_list =Question.objects.order_by('-pub_date')[:5]
  6. template = loader.get_template('demo/index.html')
  7. context ={
  8. 'latest_question_list': latest_question_list,
  9. }
  10. returnHttpResponse(template.render(context, request))
 
启动服务后,可以看到页面是这样的:

 然后我们再来重写一些demo/views.py的方法:
  1. from django.shortcuts import render
  2. from.models importQuestion
  3. def index(request):
  4. latest_question_list =Question.objects.order_by('-pub_date')[:5]
  5. context ={'latest_question_list': latest_question_list}
  6. return render(request,'demo/index.html', context)
在新的重写里面,我们不需要引入loader和HttpResponse,用render方法替换之。
 
 
 
 
 
当url链接中的id不存在的时候,启动404错误,就会给出提示,那么如何启动404错误呢?
首先,在demo/views.py中加入如下代码:
  1. from django.http importHttp404
  2. from django.shortcuts import render
  3. from.models importQuestion
  4. # ...
  5. def detail(request, question_id):
  6. try:
  7. question =Question.objects.get(pk=question_id)
  8. exceptQuestion.DoesNotExist:
  9. raiseHttp404("Question does not exist")
  10. return render(request,'demo/detail.html',{'question': question})
当然也要在demo/templates/demo/detail.html创建如下代码
 
还有一个比较快捷的办法是使用get_object_or_404()这个方法
把这段代码放入demo/views.py中
  1. from django.shortcuts import get_object_or_404, render
  2. from.models importQuestion
  3. # ...
  4. def detail(request, question_id):
  5. question = get_object_or_404(Question, pk=question_id)
  6. return render(request,'demo/detail.html',{'question': question})
除了get_object_or_404()外,还有get_list_or_404() 方法,也有类似的用途
 
 
 
 
使用template system:
在demo/templates/demo/detail.html中添加以下代码:
  1. <h1>{{ question.question_text }}</h1>
  2. <ul>
  3. {%for choice in question.choice_set.all %}
  4. <li>{{ choice.choice_text }}</li>
  5. {% endfor %}
  6. </ul>
可以看到在question中多了choice中的内容

 
 
 
 
关于URL中的hardcode如何移去:
我们看到在demo/index.html中的代码长这个样子
  1. <li><a href="/demo/{{ question.id }}/">{{ question.question_text }}</a></li>
这个‘demo’实在是太难看了,我们要想办法移去,替换成:
  1. <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
在demo/urls中可以看到如下代码:
  1. ...
  2. # the 'name' value as called by the {% url %} template tag
  3. url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
  4. ...
不过我们希望在链接中加入“specifics”,这样可以更好地说明这是显示的是它的detail,那么就改成:
  1. ...
  2. # added the word 'specifics'
  3. url(r'^specifics/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
  4. ...
 
 
 
 
在URL中添加名字空间,避免不同的app的url冲突:
在demo/urls.py下面添加app_name:
  1. from django.conf.urls import url
  2. from.import views
  3. app_name ='demo'
  4. urlpatterns =[
  5. url(r'^$', views.index, name='index'),
  6. url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
  7. url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
  8. url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
  9. ]
然后把demo/index.html中的如下代码:
  1. <li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
改为:
  1. <li><a href="{% url 'demo:detail' question.id %}">{{ question.question_text }}</a></li>
这样在template中调用url的时候就不会发生命名冲突了
 
 
 

Python学习笔记(Django篇)——4、继续完善视图层的更多相关文章

  1. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  2. Python学习笔记进阶篇——总览

    Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(Socket编程进阶&多线程.多进程) Python学习笔记——进阶篇[第八周]———进程.线程.协程篇(异常处理) Pyth ...

  3. Python学习笔记基础篇——总览

    Python初识与简介[开篇] Python学习笔记——基础篇[第一周]——变量与赋值.用户交互.条件判断.循环控制.数据类型.文本操作 Python学习笔记——基础篇[第二周]——解释器.字符串.列 ...

  4. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  5. python学习笔记--Django入门0 安装dangjo

    经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...

  6. Python学习笔记——基础篇【第七周】———类的静态方法 类方法及属性

    新式类和经典类的区别 python2.7 新式类——广度优先 经典类——深度优先 python3.0 新式类——广度优先 经典类——广度优先 广度优先才是正常的思维,所以python 3.0中已经修复 ...

  7. Python 学习笔记---基础篇

    1. 简单测试局域网中的电脑是否连通.这些电脑的ip范围从192.168.0.101到192.168.0.200 import subprocess cmd="cmd.exe" b ...

  8. python学习笔记--Django入门一 网页显示时间

    我的笔记是学习http://djangobook.py3k.cn/ 课程时做的,这个上边的文章讲的确实是非常的详细,非常感谢你们提供的知识. 上一篇随笔中已经配置好了Django环境,现在继续跟随ht ...

  9. Python学习笔记——基础篇【第一周】——变量与赋值、用户交互、条件判断、循环控制、数据类型、文本操作

    目录 Python第一周笔记 1.学习Python目的 2.Python简史介绍 3.Python3特性 4.Hello World程序 5.变量与赋值 6.用户交互 7.条件判断与缩进 8.循环控制 ...

  10. Python学习笔记——基础篇【第六周】——面向对象

    Python之路,Day6 - 面向对象学习 本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.       同时可参考链接: http:// ...

随机推荐

  1. vue数据绑定html

    html标签的纯文本显示/被当做html标签处理: 1)使用两个大括号时,假如字符串内容是html标签,那么不会被转义: 2)使用三个大括号时,字符串内的html标签会被直接转义 a.两个大括号: & ...

  2. scrapy之分布式

    分布式爬虫 概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取. 原生的scrapy是不可以实现分布式爬虫? a) 调度器无法共享 b) 管道无法共享 工具 scrapy-redis组件: ...

  3. order-by-offset-fetch

  4. 1016-06-首页20-封装工具条---UITableView控件距离顶部的间距问题----cell选中时的背景颜色设置

    一.设置UITableView里面的顶部 cell 距离顶部的间距的三种方式: 方法 1. 直接设置: self.tableView.contentInset = UIEdgeInsetsMake(H ...

  5. Hive环境搭建及基本操作

    伪分布式 一.安装及配置Hive 1.配置HADOOP_HOME和Hive conf 目录hive-env.sh # Set HADOOP_HOME to point to a specific ha ...

  6. Kali Linux 搜狗输入法安装

    1.下载 搜狗输入法 for Linux http://pinyin.sogou.com/linux/ //有64位和32位的deb包 我这里下载的是 : sogoupinyin_2.1.0.0086 ...

  7. STM8S PWM输出停止后 IO口电平输出

    STM8S有许多定时器支持PWM输出,但在停止定时器后,IO口电平到底是多少呢?或高或低. 因此,为了确定PWM停止输出电平后其对应的值是多少,我们在停止PWM输出时需要对CCMR1寄存器进行设置. ...

  8. 2037: [Sdoi2008]Sue的小球

    2037: [Sdoi2008]Sue的小球 链接 题解 论文 代码 #include<cstdio> #include<algorithm> #include<cstr ...

  9. 世界未解之谜之----------Android Gradle

    今天运行项目,运行的debug出来的包竟然是命名过的,但是我的buildTypes里面的debug 并没有执行重命名操作.很奇怪,我的猜测是: 执行buildTypes的时候,虽然是assermdeb ...

  10. ADMX Migrator

    实用工具特别推荐ADMX MigratorLance Whitney 下载这篇文章的代码: ADMX Migrator (2765KB) 对于那些 使用组策略的人而言,他们自然非常熟悉如何使用管理模板 ...