在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. go get超时解决办法

    go get gopkg.in/yaml.v2超时,发现被墙了,解决办法如下: 1.安装golang.org/x/net $ mkdir -p $GOPATH/src/golang.org/x/ $ ...

  2. Lo、Hi、HiByte、LoWord、HiWord、MakeWord、MakeLong、Int64Rec

    本话题会涉及到: Lo.Hi.HiByte.LoWord.HiWord.MakeWord.MakeLong.Int64Rec 譬如有一个 Cardinal 类型的整数: 1144201745其十六进制 ...

  3. php扩展开发-面向对象

    在zval变量里IS_OBJECT类型使用zend_object_value来保存变量的,我们看一下他的具体结果. typedef struct _zend_object_value { zend_o ...

  4. [Bzoj1034][ZJOI2008]泡泡堂BNB(贪心)

    Description 题目链接 Solution 这题就是一个贪心, 如果最弱的能赢对方最弱的就赢 否则最强的能赢对面最强的就赢 否则最弱的换对面最强 Code #include <cstdi ...

  5. [Bzoj1037][ZJOI2008]生日聚会(DP)

    Description 题目链接 Solution 这题状态比较难想, \(dp[i][j][g][h]\)表示强i个人有j个男生,在某个区间男生最多比女生多g人,女生最多比男生多h人的方案数,然后D ...

  6. 3-1 练习 HTML 总结

    1.段落 #段落 <div class="ui segment"> </div> #翻转 <div class="ui inverted s ...

  7. Python数据类型一

    一.整型 在Python内部对整数的处理分为普通整数和长整数,普通整数长度为机器位长,通常都是32位,超过这个范围的整数就自动当长整数处理,而长整数的范围几乎完全没限制Python可以处理任意大小的整 ...

  8. css一些事儿

    1. margin和padding 如果边界画一条线,则margin的属于边界外,padding属于边界内 当我们给元素背景色时,margin区域不会被着色,而padding区域会被着色. 当上下两个 ...

  9. 什么时候会报unrecognized selector的异常?

    当调用该对象上某个方法,而该对象上没有实现这个方法的时候, 可以通过“消息转发”进行解决,如果还是不行就会报unrecognized selector异常 objc是动态语言,每个方法在运行时会被动态 ...

  10. 关于mysqldump备份非事务表的注意事项

      Preface       We're used to get a logical backup set(whole instance) by simply specifying "-- ...