设计哲学

在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. sencha touch NavigationView

    NavigationView 是官方根据Container控件扩展而来的,由一个导航栏和一个card组成,具备导航和返回时自动销毁当前界面的功能,非常适合新手使用. 其中导航栏的代码如下: Ext.d ...

  2. 问题记录,如何解决confluence的office预览的时候的乱码问题

    在新的服务器(ubuntu16.04)上安装confluence,预览office的附件的时候,发现中文无法正确显示 在网上搜了一下,搜到一篇官方的文档,是关于这个问题的 问题原因: 在服务器上没有安 ...

  3. VC++组合框——学习笔记1(组合框选项的添加和无法显示下拉选项)

    VC++控件 ---组合框  环境VC2003 1.组合框添加下拉菜单选项  现在有尝试了两个命令 (m_com为组合框控control类型的变量.) 方法一  m_com.AddString(&qu ...

  4. [图书] C++

    作者 书名 Bjarne Stroustrup    The Design and Evolution of C++Stanley B. Lippman    C++ PrimerStanley B. ...

  5. Java虚拟机九 java.lang.String在虚拟机中的实现

    在Java中,Java的设计者对String对象进行了大量的优化,主要有三个特点: 1.不变性: 不变性是指String对象一旦生成,则不能再对它进行改变.String的这个特点可以泛化成不变(imm ...

  6. Spark ML包,数据挖掘示例数据Affairs

    1.数据字段解释 affairs:一年来婚外情的频率   gender:性别   age:年龄   yearsmarried:婚龄   children:是否有小孩   religiousness:宗 ...

  7. Spark2 Dataset DataFrame空值null,NaN判断和处理

    import org.apache.spark.sql.SparkSession import org.apache.spark.sql.Dataset import org.apache.spark ...

  8. PostgreSql数据库查询表信息/列信息(列ID/列名/数据类型/长度/精度/是否可以为null/默认值/是否自增/是否是主键/列描述)

    查询表信息(表名/表描述) select a.relname as name , b.description as value from pg_class a ) b on a.oid = b.obj ...

  9. TOP100summit 2017:小米唐沐等大咖精心挑选的100个年度研发案例实践

    2017年,机器学习.大数据.人工智能等词汇成为软件研发行业的主流,大前端.DevOps.区块链等技术方式成为热点方向:2017年,智能硬件开始成为新的焦点,这一年更被称为智能音箱井喷的一年:2017 ...

  10. JSTL 学习

    对于页面访问数据的统计,可以使用内置对象的相应方法进行计数工作,这个对象要在jsp对象的整个生命周期中setAttribute()和getAttribute()application.setAttri ...