设计哲学

在Django中一个视图有指定函数和指定模版组成。
对于某些特定的应用应该分成若干视图。例如博客系统

  • Blog主页面
  • 详细页面入口
  • 基于年的页面展示
  • 基于月的页面展示
  • 基于天的页面展示
  • 评论行为(action)

而对于投票应用,则由

  • 投票主页
  • 投票细节页面
  • 投票结果页面
  • 投票行为(action)

在Django中,页面由视图(views)表达,而视图由一个简单的函数(成员函数)展示。Django通过URL来精确匹配一个视图,即URLconfs

视图层的编写

1. 编写应用试图polls/views.py

from django.http import HttpResponse

def index(request):
return HttpResponse("Hello, world. You're at the poll index.")

2. 编写应用URLpolls/urls.py

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
url(r'^$', views.index, name='index')
)

3. 编写项目URL

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
url(r'^polls/', include('polls.urls')),
url(r'^admin/', include(admin.site.urls)),
)

URL的参数

  1. 第一个参数为正则表达式,用r开头的原始字符串不会被Python转义
  2. 第二个参数指定视图函数
  3. 第三个参数,一般不用
  4. 第四个参数为此URL取别名

通过URL传递参数

1. 编写URL

(?P<poll_id>\d+)指该部分的URL为一个参数,参数的名字由?P<poll_id>指定,\d+只由一个或更多的数组组成。
from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
# ex: /polls/
url(r'^$', views.index, name='index'),
# ex: /polls/5/
url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
# ex: /polls/5/results/
url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
# ex: /polls/5/vote/
url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)

2. 接收参数

def detail(request, poll_id):
return HttpResponse("You're looking at poll %s." % poll_id) def results(request, poll_id):
return HttpResponse("You're looking at the results of poll %s." % poll_id) def vote(request, poll_id):
return HttpResponse("You're voting on poll %s." % poll_id)

与数据库连接,显示其内容

1. 编写视图函数

from polls.models import Poll

def index(request):
latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
output = ', '.join([p.question for p in latest_poll_list])
return HttpResponse(output)

2. 建立模版

这里推荐模版的位置是polls/templates/polls/index.html

{% if latest_poll_list %}
<ul>
{% for poll in latest_poll_list %}
<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}

3. 修改视图函数

from django.http import HttpResponse
from django.template import RequestContext, loader from polls.models import Poll def index(request):
latest_poll_list = Poll.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = RequestContext(request, {
'latest_poll_list': latest_poll_list,
})
return HttpResponse(template.render(context))

4. 利用快捷方式简化代码

from django.shortcuts import render

from polls.models import Poll

def index(request):
latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
context = {'latest_poll_list': latest_poll_list}
return render(request, 'polls/index.html', context)

查找页面——404页面的返回

利用try-catch解决404

from django.http import Http404
from django.shortcuts import render from polls.models import Poll
# ...
def detail(request, poll_id):
try:
poll = Poll.objects.get(pk=poll_id)
except Poll.DoesNotExist:
raise Http404
return render(request, 'polls/detail.html', {'poll': poll})

此时的polls/detail.html可只填写内容{{poll}}

利用快捷方式简化代码

from django.shortcuts import render, get_object_or_404

from polls.models import Poll
# ...
def detail(request, poll_id):
poll = get_object_or_404(Poll, pk=poll_id)
return render(request, 'polls/detail.html', {'poll': poll})

针对get的函数为get_object_or_404,针对filter的函数为get_list_or_404。
此快捷方式有助于在视图层不用关心数据层的内容,更好的解耦合。

使用模版系统

#polls/detail.html
<h1>{{ poll.question }}</h1>
<ul>
{% for choice in poll.choice_set.all %}
<li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

poll.choice_set.all为函数调用,返回一个列表。

URL别名的使用

1. 为了简化URL,消除掉难看的代码。

<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>
#既是前面提到的URL别名

2. URL命名空间

上文所述的别名会造成重名而使Django匹配出错,因此使用命名空间

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover() urlpatterns = patterns('',
url(r'^polls/', include('polls.urls', namespace="polls")),
url(r'^admin/', include(admin.site.urls)),
)

相应地,修改

<li><a href="{% url 'polls:detail' poll.id %}">{{ poll.question }}</a></li>

Django初级手册3-视图层与URL配置的更多相关文章

  1. Django路由层与视图层、pycharm虚拟环境

    一. Django路由层 路由层即对应项目文件下的urls.py文件.实际上每个APP中也可以有自己的urls.py路由层.templates文件夹及static文件夹.Django支持这么做,也为实 ...

  2. django之创建第7-2个项目-url配置分离

    1.urls.PY分离 # -*- coding: UTF-8 -*- from django.conf.urls import patterns, include, url # Uncomment ...

  3. The Django Book 第三章 试图和URL配置

    之前自学Django也有一段时间了,再过一个月就要入职新公司了(Python Django开发),即使现在还在入门级徘徊,再好好把Django基础过一遍吧. The Django Book 第三章 试 ...

  4. django 实战篇之视图层

    视图层(views.py) django必会三板斧 HttpResponse >>> 返回字符串 render >>> 支持模板语法,渲染页面,并返回给前端 red ...

  5. Django 路由层与视图层

    1.路由层 1.1无名分组 1.2 有名分组 1.3 反向解析 1.4 路由分发 1.5 名称空间 2.伪静态网页 3.虚拟环境 4.视图层 1.1 JsonResponse 1.2 FBV与CBV ...

  6. Django路由层与视图层

    表与表之间建关系 图书管理系统为例 书籍表 出版社表 作者表 三个表之间的关系: 考虑表之间的关系:换位思考 1.书籍和出版社是一对多,外键字段建立在书籍表中 2.书籍和作者是多对多, 需要建立第三方 ...

  7. Django初级手册6-静态文件

    用Django加载外部文件 在Django中iamges,JS或者CSS通称为static文件 定制APP的外观 一般放在应用目录下的static/polls/目录下,下为polls/static/p ...

  8. Django初级手册5-自动化测试

    什么是自动化测试 每次更新完系统后,可自动进行测试,而不是手工从头测试一遍: 从长远和全局的角度看,测试能节约我们的时间: 测试是一种积极的行为,它能预防问题,而不仅仅是识别问题: 测试有助于代码美观 ...

  9. Django初级手册4-表单与通用视图

    表单的编写 1. detail.html模版的编写 <h1>{{ poll.question }}</h1> {% if error_message %}<p>&l ...

随机推荐

  1. nginx expires配置

    配置expiresexpires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入   1 ...

  2. 将Linux系统的字体全改成中文

    # 修改字符集,否则可能报 input/output error的问题,因为日志里打印了中文 $ localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 $ export ...

  3. (TOJ 4413)IP address

    描述 To give you an IP address, it may be dotted decimal IP address, it may be 32-bit binary IP addres ...

  4. A simple guide to 9-patch for Android UI

    extends:http://radleymarx.com/blog/simple-guide-to-9-patch/ While I was working on my first Android ...

  5. Java虚拟机六 堆溢出的处理

    在Java程序中,如果堆空间不足,有可能抛出内存溢出错误:Out Of Memory,简称OOM. Exception in thread "main" java.lang.Out ...

  6. 第一个maven项目

    1.新建maven project 注意:勾上create a new simple project 2.填写相关信息, Grounp id为大项目名字,Artifact id为小项目的名字.注意:P ...

  7. 图论-桥/割点/双连通分量/缩点/LCA

    基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...

  8. VMware 安装CentOS 6.5图文步骤 以及安装后无法联网的解决办法

    一.VMwareWorkstation10 中安装Centos6.5(64位)步骤: 首先下载vmware 和centos6.5 1. 打开VMware-workstation点击“新建虚拟机”,到向 ...

  9. python-django开发学习笔记一

    1.简述 1.1 开发环境 该笔记所基于的开发环境为:windows8.python2.7.5.psycopg2-2.4.2.django1.5.4.pyCharm-2.7.3.以上所描述的软件.插件 ...

  10. Solr学习笔记之问题汇总

    一. 问题描述:Solr在建立索引时候出现如下错误:org.apache.solr.common.SolrException: Document [null] missing required fie ...