设计哲学

在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. 题目1003:A+B(按逗号分隔的A+B)

    题目链接:http://ac.jobdu.com/problem.php?pid=1003 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...

  2. nginx配置虚拟主机之不同端口和不同IP地址

    配置nginx虚拟主机不同端口和不同ip地址,和上编nginx基于域名配置虚拟主机博文类似,请先参考. zxl.com域名不同端口,配置文件内容如下: 1 2 3 4 5 6 7 8 9 10 11 ...

  3. css实现表格的td里面的内容居中.

    <td align="center" valign="middle">前一个是水平居中 后一个是垂直居中对应的css写法:<td style= ...

  4. Mapreduce其他部分

    1.hadoop的压缩codec Codec为压缩,解压缩的算法实现. 在Hadoop中,codec由CompressionCode的实现来表示.下面是一些实现: 可分割性:可分割与不可分割的区别:文 ...

  5. sqoop学习笔记

    #################################################################################################### ...

  6. 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75; 链接 fastcgi_read_timeout 600; 读取 fastcgi_send_timeout 600; 发请求

    使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75;  链接 fastcgi_read_timeout 600; ...

  7. USB--- kvm in ubuntu:

    USB SS=USB SuperSpeed=USB 3.0!!顺应此前的USB 1.1 FullSpeed和USB 2.0 HighSpeed https://jingyan.baidu.com/ar ...

  8. 四种数据库随机获取N条数据的方法

    1.SQL Server: SELECT TOP  n  *  FROM  tableName ORDER BY NEWID(); 2.ORACLE: SELECT * FROM (SELECT * ...

  9. Kubernetes容器调度

    Kubernetes的调度器是Kubernetes众多组件的一部分,独立于API服务器之外.调度器本身是可插拔的,任何理解调度器和API服务器之间调用关系的工程师都可以编写定制的调度器.本文后面的介绍 ...

  10. 牛客练习赛18E pocky游戏 状压dp

    正解:状压dp+辅助dp 解题报告: 来还债辣!NOIp之后还是轻松很多了呢,可以一点点儿落实之前欠下的各种东西一点点提升自己!加油鸭! 是个好题,可以积累套路,启发性强,而且很难 哦而且状压它也是个 ...