在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. 《算法》第四版 IDEA 运行环境的搭建

    <算法>第四版 IDEA 运行环境的搭建 新建 模板 小书匠 在搭建之初,我是想不到会出现如此之多的问题.我看了网上的大部分教程,都是基于Eclipse搭建的,还没有使用IDEA搭建的教程 ...

  2. 搭建一个简单的dns缓存服务器

    环境:linux 软件:bind97,bind97-utils, bind97-libs ip:192.168.192.130:192.168.192.131 -------------------- ...

  3. C语言数组篇(三)字符空间 和 非字符空间

     一维数组和字符串         首先是字符数组(区别字符串) ] = {'a','b','c'}; //这只是单纯的字符数组,不是字符串          字符串最重要的标志就是结尾有一个'\0' ...

  4. POJ:3977-Subset(双向搜索)

    Subset Time Limit: 30000MS Memory Limit: 65536K Total Submissions: 5961 Accepted: 1129 Description G ...

  5. P3818 小A和uim之大逃离 II(洛谷月赛)

    P3818 小A和uim之大逃离 II 题目背景 话说上回……还是参见 https://www.luogu.org/problem/show?pid=1373 吧 小a和uim再次来到雨林中探险.突然 ...

  6. 线程间通信(等待,唤醒)&Java中sleep()和wait()比较

    1.什么是线程间通信? 多个线程在处理同一资源,但是任务却不同. 生活中栗子:有一堆煤,有2辆车往里面送煤,有2辆车往外拉煤,这个煤就是同一资源,送煤和拉煤就是任务不同. 2.等待/唤醒机制. 涉及的 ...

  7. 设置MySQL允许外网访问 费元星 feiyuanxing.com 站长

    1.修改配置文件sudo vim /etc/mysql/my.cnf把bind-address参数的值改成你的内/外网IP或0.0.0.0,或者直接注释掉这行. 2.登录数据库mysql -u roo ...

  8. 【tmux环境配置】在centos6.4上配置tmux

    我学习tmux的动力如下: (1)tmux大法好.原因是被同学安利过tmux. (2)多个terminal下ssh到开发机太麻烦.还是之前实习的时候,总要开N个terminal去ssh开发机,这种东西 ...

  9. Linux之Permission denied没有权限

    在Linux上启动solr时,出现-bash: ./solr: Permission denied的问题. 最简单的解决方式: chmod 777 solr 傻瓜式直接赋予权限

  10. 小程序使用Canvas画饼图

    先上效果图 -------------------------------------------------------------wxml代码开始------------------------- ...