在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. ethereum(以太坊)(三)--合约单继承与多继承

    pragma solidity ^0.4.0; // priveta public internal contract Test{ //defualt internal uint8 internal ...

  2. Apache Maven(二):构建生命周期

    Maven 约定的目录结构 我要遵循Maven已经约定好的目录结构,才能让maven在自动构建过程中找到对应的资源进行构建处理.以下是maven约定的目录结构: 项目名称 |-- pom.xml :M ...

  3. pytorch中torch.nn构建神经网络的不同层的含义

    主要是参考这里,写的很好PyTorch 入门实战(四)--利用Torch.nn构建卷积神经网络 卷积层nn.Con2d() 常用参数 in_channels:输入通道数 out_channels:输出 ...

  4. rootfls(根操作系统)

    rootfs根文件系统,linux下的任何目录都是rootfs的一个路径 Files 文件 Directory   目录 FHS(文件层级标准)规定了linux发行标准,也就是一些固定的文件存储 文件 ...

  5. linux无名管道

    特点 无名管道是半双工的,也就是说,一个管道要么只能读,要么只能写 只能在有共同祖先的进程间使用(父子进程.兄弟进程.子孙进程等) fork或者execve调用创建的子进程,继承了父进程的文件描述符 ...

  6. 裸机——Nand

    1.首先需要知道Nand的基础知识 从Nand的芯片手册可以获得 我使用的芯片手册是 K9F2G08 首先从芯片手册的名称可以获得信息: K9F:三星 2G   : 2Gb (256MB) 08    ...

  7. 010---Django的模型层(2)

    确定模型关系: ''' Publish ---- Book 多对一:一个出版社对应多本书,在多的那张表添加关联字段 Book ---- Author 多对多:一个书对应多个作者,多个作者对应一本书 会 ...

  8. [Bzoj3252]攻略(dfs序+线段树)

    Description 题目链接 Solution 可以想到,每次肯定是拿最大价值为最优 考虑改变树上一个点的值,只会影响它的子树,也就是dfs序上的一个区间, 于是可以以dfs序建线段树,这样就变成 ...

  9. 分布式爬虫:使用Scrapy抓取数据

    分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘. ...

  10. 利用 ESLint 检查代码质量

    原文发表于作者的个人博客:http://morning.work/page/maintainable-nodejs/getting-started-with-eslint.html 其实很早的时候就想 ...