5.Django入门:教程-视图和模板
2017-04-11 13:51
656 查看
创建视图和模板
1.原理
视图是Django应用中的一“类”网页,它通常使用一个特定的函数提供服务,并且具有一个特定的模板。在Django中,网页的页面和其他内容都是由视图来传递的(视图对WEB请求进行回应)。 每个视图都是由一个简单的Python函数(或者是基于类的视图的方法)表示的。Django通过检查请求的URL(准确地说,是URL里域名之后的那部分)来选择使用哪个视图。
URL模式就是一个URL的通用形式 —— 例如: /newsarchive///。
Django使用叫做‘URLconfs’的配置来为URL匹配视图。 一个URLconf负责使用正则表达式将URL模式匹配到视图。
2.编写视图
polls/views.pyfrom django.http import HttpResponse def index(request): return HttpResponse("Hello, world. You're at the polls index.")
polls/urls.py
from django.conf.urls import url from . import views urlpatterns = [ url(r'^$', views.index, name='index'), ]
下一步,让主URLconf可以链接到polls.urls模块。在mysite/urls.py中插入一个include()
mysite/urls.py
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^polls/', include('polls.urls')), url(r'^admin/', include(admin.site.urls)), ]
(1)url()参数:regex
Django从第一个正则表达式开始,依次将请求的URL与每个正则表达式进行匹配,直到找到匹配的那个为止。请注意,这些正则表达式不会检索URL中GET和POST的参数以及域名。
最后,性能方面的一个注意点:这些正则表达式会在URLconf模块第一次载入的时候被编译。 它们超级快(只要这些正则表达式不像上面提醒的那样过于复杂)。
(2)url()参数:view
当Django找到一个匹配的正则表达式时,它就会调用view参数指定的视图函数,并将HttpRequest对象作为第一个参数,从正则表达式中“捕获”的其他值作为其他参数,传入到该视图函数中。如果正则表达式使用简单的捕获方式,值将作为位置参数传递; 如果使用命名的捕获方式,值将作为关键字参数传递。(3)url()参数:kwargs
任何关键字参数都可以以字典形式传递给目标视图。(4)url()参数:name
命名你的URL。 这样就可以在Django的其它地方尤其是模板中,通过名称来明确地引用这个URL。 这个强大的特性可以使你仅仅修改一个文件就可以改变全局的URL模式。3.编写更多视图
polls/views.pydef detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)
polls/urls.py
from django.conf.urls import url from . import views urlpatterns = [ # ex: /polls/ url(r'^$', views.index, name='index'), # ex: /polls/5/ url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'), # ex: /polls/5/results/ url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'), # ex: /polls/5/vote/ url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'), ]
4.编写拥有实际功能的视图
每个视图函数只负责处理两件事中的一件:返回一个包含所请求页面内容的 HttpResponse对象,或抛出一个诸如Http404异常。(1)组织模板
默认的设置文件settings.py配置了一个DjangoTemplates后端,其中将APP_DIRS选项设置为True。按照惯例,DjangoTemplates在 INSTALLED_APPS所包含的每个应用的目录下查找名为”templates”子目录。首先,在你的polls目录下创建一个叫做 templates的目录。在创建的templates目录中,创建另外一个目录polls,并在其中创建一个文件index.html。换句话讲,你的模板应该位于 polls/templates/polls/index.html。由于app_directories 模板加载器按照上面描述的方式工作,在Django中你可以简单地用polls/index.html引用这个模板。
(2)模板命名空间
可以直接将我们的模板放在polls/templates中(而不用创建另外一个polls子目录),但实际上这是个坏主意。Django将选择它找到的名字匹配的第一个模板文件,如果你在不同 的应用有相同名字的模板文件,Django将不能区分它们。我们需要将Django指向正确的模板,最简单的方式是使用命名空间。具体实现方式是,将这些模板文件放在以应用的名字来命名的另一个目录下。olls/templates/polls/index.html
{% if latest_question_list %} <ul> {% for question in latest_question_list %} <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li> {% endfor %} </ul> {% else %} <p>No polls are available.</p> {% endif %}
polls/views.py
from django.http import HttpResponse from django.template import RequestContext, loader from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] template = loader.get_template('polls/index.html') context = RequestContext(request, { 'latest_question_list': latest_question_list, }) return HttpResponse(template.render(context))
(3)快捷方式:render()
常见的习惯是载入一个模板、填充一个context 然后返回一个含有模板渲染结果的HttpResponse对象。一旦我们在所有的视图上都应用这个快捷函数,我们将不再需要导入 loader、RequestContext和HttpResponse
render()函数将请求对象作为它的第一个参数,模板的名字作为它的第二个参数,一个字典作为它可选的第三个参数。 它返回一个HttpResponse对象,含有用给定的context 渲染后的模板。
polls/views.py
from django.shortcuts import render from .models import Question def index(request): latest_question_list = Question.objects.order_by('-pub_date')[:5] context = {'latest_question_list': latest_question_list} return render(request, 'polls/index.html', context)
5.引发一个404错误
polls/views.pyfrom django.http import Http404 from django.shortcuts import render from .models import Question # ... def detail(request, question_id): try: question = Question.objects.get(pk=question_id) except Question.DoesNotExist: raise Http404("Question does not exist") return render(request, 'polls/detail.html', {'question': question})
(1)快捷方式:get_object_or_404()
一种常见的习惯是使用get()并在对象不存在时引发Http404。Django为此提供一个快捷方式。polls/views.py
from django.shortcuts import get_object_or_404, render from .models import Question # ... def detail(request, question_id): question = get_object_or_404(Question, pk=question_id) return render(request, 'polls/detail.html', {'question': question})
get_object_or_404() 函数将一个Django模型作为它的第一个参数,任意数量的关键字参数作为它的第二个参数,它会将这些关键字参数传递给模型管理器中的get() 函数。如果对象不存在,它就引发一个 Http404异常。
为什么我们要使用一个辅助函数get_object_or_404()而不是在更高层自动捕获ObjectDoesNotExist异常,或者让模型的API 引发 Http404 而不是ObjectDoesNotExist?
因为那样做将会使模型层与视图层耦合在一起。 Django最重要的一个设计目标就是保持松耦合。 一些可控的耦合将会在django.shortcuts 模块中介绍。
还有一个get_list_or_404()函数,它的工作方式类似get_object_or_404() —— 差别在于它使用filter()而不是get()。如果列表为空则引发Http404。
6.使用模板系统
polls/templates/polls/detail.html<h1>{{ question.question_text }}</h1> <ul> {% for choice in question.choice_set.all %} <li>{{ choice.choice_text }}</li> {% endfor %} </ul>
7.移除模板中硬编码的URLs
链接中一部分是硬编码的<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
可以通过使用{% url %}模板标签来移除对你的URL配置中定义的特定的URL的依赖
<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>
8.带命名空间的URL名字
例如,polls 应用具有一个detail 视图,相同项目中的博客应用可能也有这样一个视图。当使用模板标签{% url %}时,人们该如何做才能使得Django知道为一个URL创建哪个应用的视图?答案是在你的主URLconf下添加命名空间。 在mysite/urls.py文件中,添加命名空间将它修改成:
mysite/urls.py
from django.conf.urls import include, url from django.contrib import admin urlpatterns = [ url(r'^polls/', include('polls.urls', namespace="polls")), url(r'^admin/', include(admin.site.urls)), ]
将你的模板polls/index.html修改为指向具有命名空间的详细视图
polls/templates/polls/index.html
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
相关文章推荐
- Part 3:视图和模板--Django从入门到精通系列教程
- 13.django入门01(django入门初探视图,模板,路由)
- 6.Django入门:教程-表单和通用视图
- Part 4:表单和类视图--Django从入门到精通系列教程
- [django]入门教程2:视图开发-定义视图函数及配置相应URL
- [django]入门教程3:模板语法及使用
- 【django入门教程】Django的安装和入门
- django学习2 视图和模板
- Django入门-6:视图-HttpReqeust对象
- Django入门-6:视图-中间件、CSRF
- ASP.NET MVC4 新手入门教程之三 ---3.添加视图
- Django入门-6:视图-状态保持
- Asp.Net MVC4.0 官方教程 入门指南之六--查看Edit方法和Edit视图
- [django]入门教程4:操作数据库
- AngularJS入门教程07:路由与多视图
- 无废话MVC入门教程四[视图中的Layout使用]
- Django学习笔记1 url、视图和模板
- Expression Blend实例中文教程(13) - 控件模板快速入门ControlTemplates
- Android基础入门教程——2.4.13 ViewFlipper(翻转视图)的基本使用
- 【Django第一步】第三部分:视图和模板