Django入门笔记【三】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/

*该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法。

Public interface - views.

1. 定义

视图(View)是Django应用中用于实现某一特定功能的Web页面。比如,一个博客可以有博客展示页面,博客创建页面,评论页面。

2. 视图示例

写入代码

1 #polls/views.py
2
3 from django.http import HttpResponse
4
5 def index(request):
6     return HttpResponse("Hello, world. You‘re at the polls index.")

为了调用视图,我们需要将它映射到一个URL上,因此在polls目录下创建urls.py,最终目录结构如图所示

1 polls/
2     __init__.py
3     admin.py
4     models.py
5     tests.py
6     urls.py
7     views.py

在polls/urls.py中添加以下代码

1 # polls/urls.py
2
3 from django.conf.urls import url
4
5 from . import views
6
7 urlpatterns = [
8     url(r‘^$‘, views.index, name=‘index‘),
9 ]

将根目录中的URLconf定位至polls/urls中,使用include()方法:

1 # mysite/urls.py
2
3 from django.conf.urls import include, url
4 from django.contrib import admin
5
6 urlpatterns = [
7     url(r‘^polls/‘, include(‘polls.urls‘)),
8     url(r‘^admin/‘, include(admin.site.urls)),
9 ]

现在可以通过http://localhost:8000/polls/进入polls应用的视图。

url()方法有四个参数,必填两个:regex, view;选填两个:kwargs, name。其中,regex对模式(pattern)进行匹配,不区分GET和POST;完成匹配后,Django会调用view函数,并将HttpRequest和其他参数传入view函数中;kwargs将关键字参数传入view函数中;name可以对URL 命名

3. 更多视图示例

向polls/views.py中添加更多视图,和前面不同,这些视图需要接收参数

 1 # polls/views.py
 2
 3 def detail(request, question_id):
 4     return HttpResponse("You‘re looking at question %s." % question_id)
 5
 6 def results(request, question_id):
 7     response = "You‘re looking at the results of question %s."
 8     return HttpResponse(response % question_id)
 9
10 def vote(request, question_id):
11     return HttpResponse("You‘re voting on question %s." % question_id)

将这些视图映射到polls.urls

 1 # polls/urls.py
 2
 3 from django.conf.urls import url
 4
 5 from . import views
 6
 7 urlpatterns = [
 8     # ex: /polls/
 9     url(r‘^$‘, views.index, name=‘index‘),
10     # ex: /polls/5/
11     url(r‘^(?P<question_id>[0-9]+)/$‘, views.detail, name=‘detail‘),
12     # ex: /polls/5/results/
13     url(r‘^(?P<question_id>[0-9]+)/results/$‘, views.results, name=‘results‘),
14     # ex: /polls/5/vote/
15     url(r‘^(?P<question_id>[0-9]+)/vote/$‘, views.vote, name=‘vote‘),
16 ]

Django实现视图的逻辑如下,以用户访问"/polls/34/"为例:

首先,Django寻找‘^polls/‘的相应匹配;

然后,Django会剥离匹配的字符串"polls/",同时将剩下的文本"34/"发送至‘polls.urls‘;

最后,在‘polls.urls‘的URLconf中进一步匹配r‘^(?P<question_id>[0-9]+)/$‘,并调用detail()视图。

4. 视图再举例

每一个视图都必须完成两个事件之一:返回HttpResponse,或者Http404。其余取决于应用需求。

 1 # polls/views.py
 2
 3 from django.http import HttpResponse
 4
 5 from .models import Question
 6
 7 def index(request):
 8     latest_question_list = Question.objects.order_by(‘-pub_date‘)[:5]
 9     output = ‘, ‘.join([p.question_text for p in latest_question_list])
10     return HttpResponse(output)
11 # Leave the rest of the views (detail, results, vote) unchanged

但是这里有一个问题,视图页面是硬编码的(hard-coded)。推荐将模板和Python代码独立。

首先,创建polls/templates目录。Django会在该目录下寻找模板。TEMPLATES设置中的默认后台DjangoTemplates会在每个INSTALLED_APP下寻找templates子目录。

然后,创建polls/templates/polls/index.html。这里创建第二个polls子目录的目的在于,区分不同应用下相同名称的index.html文件。

接着,修改index.html文件

 1 # polls/templates/polls/index.html
 2
 3 {% if latest_question_list %}
 4     <ul>
 5     {% for question in latest_question_list %}
 6         <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
 7     {% endfor %}
 8     </ul>
 9 {% else %}
10     <p>No polls are available.</p>
11 {% endif %}

最后,修改polls/views.py文件

 1 # polls/views.py
 2
 3 from django.http import HttpResponse
 4 from django.template import RequestContext, loader
 5
 6 from .models import Question
 7
 8
 9 def index(request):
10     latest_question_list = Question.objects.order_by(‘-pub_date‘)[:5]
11     template = loader.get_template(‘polls/index.html‘)
12     context = RequestContext(request, {
13         ‘latest_question_list‘: latest_question_list,
14     })
15     return HttpResponse(template.render(context))

该代码加载polls/index.html,并将context传递给它。Context是映射模板变量到Python对象的字典。

render()方法可以简化代码

 1 # polls/views.py
 2
 3 from django.shortcuts import render
 4
 5 from .models import Question
 6
 7
 8 def index(request):
 9     latest_question_list = Question.objects.order_by(‘-pub_date‘)[:5]
10     context = {‘latest_question_list‘: latest_question_list}
11     return render(request, ‘polls/index.html‘, context)

5. 抛出404错误

通过detail视图来示范实现

 1 # polls/views.py
 2
 3 from django.http import Http404
 4 from django.shortcuts import render
 5
 6 from .models import Question
 7 # ...
 8 def detail(request, question_id):
 9     try:
10         question = Question.objects.get(pk=question_id)
11     except Question.DoesNotExist:
12         raise Http404("Question does not exist")
13     return render(request, ‘polls/detail.html‘, {‘question‘: question})

同时对polls/detail.html进行修改

1 # polls/templates/polls/detail.html
2
3 {{ question }}

使用get_object_or_404()进行代码简化

1 #polls/views.py
2
3 from django.shortcuts import get_object_or_404, render
4
5 from .models import Question
6 # ...
7 def detail(request, question_id):
8     question = get_object_or_404(Question, pk=question_id)
9     return render(request, ‘polls/detail.html‘, {‘question‘: question})

6. 使用模板系统

考虑context变量,对polls/detail.html进行修改

1 # polls/templates/polls/detail.html
2
3 <h1>{{ question.question_text }}</h1>
4 <ul>
5 {% for choice in question.choice_set.all %}
6     <li>{{ choice.choice_text }}</li>
7 {% endfor %}
8 </ul>

7. 移除模板中的硬编码URL

比如polls/index.html,原代码不利于修改:

1 <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>

改进为:

1 <li><a href="{% url ‘detail‘ question.id %}">{{ question.question_text }}</a></li>

这样改进过后,对URL的修改会变得很容易,比如,把以下代码

1 ...
2 # the ‘name‘ value as called by the {% url %} template tag
3 url(r‘^(?P<question_id>[0-9]+)/$‘, views.detail, name=‘detail‘),
4 ...

改为

1 ...
2 # added the word ‘specifics‘
3 url(r‘^specifics/(?P<question_id>[0-9]+)/$‘, views.detail, name=‘detail‘),
4 ...

8. URL命名空间

一个项目里往往有很多应用,如果两个应用都有叫做detail的视图,Django会怎么区分它们的URL名称呢?答案是mysite/urls.py中可以添加命名空间到URLconf。比如:

1 # mysite/urls.py
2
3 from django.conf.urls import include, url
4 from django.contrib import admin
5
6 urlpatterns = [
7     url(r‘^polls/‘, include(‘polls.urls‘, namespace="polls")),
8     url(r‘^admin/‘, include(admin.site.urls)),
9 ]

同时将polls.index.html从

1 # polls/templates/polls/index.html
2
3 <li><a href="{% url ‘detail‘ question.id %}">{{ question.question_text }}</a></li>

修改为

1 # polls/templates/polls/index.html
2
3 <li><a href="{% url ‘polls:detail‘ question.id %}">{{ question.question_text }}</a></li>

--The End--

时间: 2024-10-26 05:50:22

Django入门笔记【三】的相关文章

Django入门笔记

Django入门笔记 **文档包含Django安装包.学习的笔记.代码等 安装 Django参考附件,只需要把附件拷贝到你需要的目录就行.Django是1.8.16版本 Python:在附件中,其中有Django需要的依赖包 编辑器:Aptana,一个强大的IDE工具,可以在上边新建模板,支持各种语言 Django项目创建 **可以用附件中的工程目录或者自己新建 新建工程-创建Django 新建工程-配置Django工程 工程创建完成后,会在工程目录中自动创建以下几个py文件 settings.

Django入门笔记【四】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. 表单和通用视图(Forms&Generic Views) 1. 简单的表单 修改detail.html中的代码,使之含有<form>元素: 1 # polls/templates/polls/detail.html 2 3 <h1>{{ question.question_t

Django入门笔记【一】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. 1. 查看Django是否安装及版本 1 $ python -c "import django; print(django.get_version())" 2. 创建一个项目(project) 通过cd方式进入自创目录,然后运行: 1 $ django-admin startprojec

Django入门笔记【二】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. 1. 创建管理员(admin user) 运行代码 1 $ python manage.py createsuperuser 2 3 Username: admin 4 Email address: [email protected] 5 6 Password: ********* 7 Passw

Django入门笔记【六】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/ *该笔记将使用一个关于投票网络应用(poll application)的例子来阐述Django的用法. *静态文件(static files):images, JavaScript, CSS 1. 自定义应用外观(look and feel) 创建polls/static目录.Django的STATICFILES_FINDERS会寻找静态文件.在static目录下,创建polls/style.css

flask快速入门笔记三_上下文对象:Flask核心机制

首先声明:内容大部分来自huizhiwang,只是单纯记笔记. 1 请求 :WSGI WSGI,全称 Web Server Gateway Interface,或者 Python Web Server Gateway Interface ,是为 Python 语言定义的Web服务器和Web应用程序之间的一种简单而通用的接口. WSGI将Web服务分成两个部分:服务器和应用程序.WGSI服务器只负责与网络相关的两件事:接收浏览器的 HTTP请求.向浏览器发送HTTP应答:而对HTTP请求的具体处理

Django学习笔记(三)—— 模型 model

疯狂的暑假学习之 Django学习笔记(三)-- 模型 model 参考:<The Django Book> 第5章 1.setting.py 配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.', # 用什么数据库管理系统 'NAME': '', # 数据库名称,如果用sqlite,要写完整路径 'USER': '', # 如果用sqlite,这个不用写 'PASSWORD': '', # 如果用sqlite,这个不用写

Django模块笔记【三】

入门笔记翻译整理自:https://docs.djangoproject.com/en/1.8/topics/ *该笔记将对各个模块进行单独介绍 *Forms 1. 使用表单(Working with forms) 只要网站涉及到访问者的输入操作,那么就必须用到表单.在HTML中,表单是<form>...</form>中的语句集合. GET和POST是HTTP处理表单仅有的两种方式.Django中使用Form类表示表单. 对使用方法进行简单举例: 1 # forms.py 2 3

python学习笔记--Django入门四 管理站点

上一节  Django入门三 Django 与数据库的交互:数据建模 "管理员界面"是基础功能中的重要部分.. 激活管理员界面 管理界面是 Django 中最酷的一部分.但是不是所有人都需要它,所以它是可选的.这也就意味着你需要跟着三个步骤来激活它. 在你的 models 中加入admin metadata. 不是所有的models都能够(或应该)被管理员编辑,你需要给models标记一个管理员接口(interface),通过给models添加一个内部类'admin'完成接口标记.所以