设计哲学

在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. vue2.0笔记《一》列表渲染

    内容中包含 base64string 图片造成字符过多,拒绝显示

  2. [转]redhat7(centos7) not registered to Red Hat Subscription Management

    [root@controller0 ~]# yum install ntp Loaded plugins: fastestmirror, product-id, search-disabled-rep ...

  3. 【CF720D】Slalom 扫描线+线段树

    [CF720D]Slalom 题意:一个n*m的网格,其中有k个矩形障碍,保证这些障碍不重叠.问你从(1,1)走到(n,m),每步只能往右或往上走,不经过任何障碍的方案数.两种方案被视为不同,当且仅当 ...

  4. dhroid - dhroid ioc模块对 加密混淆问题

    大家应该已经看过ioc的知识在ioc基础中中视图事件都是通过注解实现的问题1如果有某个属性只声明了一下,其他代码没有引用由于混淆时会进行属性优化,将没用的属性去掉,这时需要处理 处理方法:在混淆配置文 ...

  5. Spring Boot 商城项目

    Spring Boot 商城项目 angularJS Demo1 <html> <head> <title>angularJS Demo1</title> ...

  6. spring-boot 学习笔记一

    参考博客:https://www.cnblogs.com/ityouknow/p/5662753.html 1.构建项目: 访问http://start.spring.io/,下载demo: 下载解压 ...

  7. 交换机多VLAN访问同一网络

    一.前言 经常有需求通过交换机改变IP地址或者实现在同一个交换机中建立多个VLAN访问外部网络(VLAN之间独立),在折腾了多次后,稍有心得,现记录之. 二.实现方案 何为VLAN就不在此赘述.实现起 ...

  8. 微信小程序中target与currentTarget

    target在事件流的目标阶段:currentTarget在事件流的捕获,目标及冒泡阶段.但事件流处于目标阶段,target与currentTarget指向一样, 而当处于捕获和冒泡阶段的时候,tar ...

  9. 2.4scope

    name_scope variable_scope scope (name_scope/variable_scope) from __future__ import print_function im ...

  10. 审核被拒绝。附近??Guideline 5.1.2

    5. 1.2 Legal: Privacy - Data Use and Sharing Guideline 5.1.2 - Legal - Privacy - Data Use and Sharin ...