我们接着上面的文章来继续,现在我们来专注创建公共页面 views
在 Django 应用程序中,视图是一“类”具有特定功能和模板的网页。 例如,在一个博客应用程序中,你可能会有以下视图:
- 博客首页 – 显示最新发表的博客。
- 博客详细页面 – 一篇博客的独立页面。
- 基于年份的归档页 – 显示给定年份中发表博客的所有月份。
- 基于月份的归档页 – 显示给定月份中发表博客的所有日期。
- 基于日期的归档页 – 显示给定日期中发表的所有的博客。
- 评论功能 – 为一篇给定博客发表评论。
在我们的Register中我们会有一下几个视图:
1 register 注册页面
2 index 登入页面
3 添加个人信息界面
平时你上网的时候可能会遇到像 “ME2/Sites/dirmod.asp?sid=&type=gen&mod=Core+Pages&gid=A6CD4967199A42D9B65B1B” 这种如此美丽的 URL。 但是你会很高兴知道 Django 允许我们使用比那优雅的URL 模式来展现 URL。
URL 模式就是一个简单的一般形式的 URL - 比如:/newsarchive/<year>/<month>/.
Django 是通过 ‘URLconfs’ 从 URL 获取到视图的。而 URLconf 是将 URL 模式 ( 由正则表达式来描述的 ) 映射到视图的一种配置。
编写第一个视图
打开views.py文件,然后输入下面的代码
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello,world.You are at the Register !")
在 Django 中这可能是最简单的视图了。为了调用这个视图,我们需要将它映射到一个 URL – 为此我们需要配置一个URLconf 。
在Jobs底下创建一个urls.py文件,并且输入下面的代码
from django.conf.urls import patterns,url
from jobs import views
urlpatterns=patterns('',url(r'^$',views.index,name='index'))
接下来是将register.urls模块指向rootURLconfig,在exercise下面的urls文件中插入一个include()方法,结果如下:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^jobs/', include('jobs.urls')),
url(r'^admin/', include(admin.site.urls)),
)
先在就已经在root URLconfig里面配置了index,然后我们打开服务器,输入http://127.0.0.1:8009/jobs/
这时我们就进入了index,前面无论是jobs/urls 还是exercise/urls 都有一个url()函数,其中有两个必须的参数 regex和"_views",两个可选的"_kwargs"以及"_name",接下来来讨论这几个参数的意义。
url()参数regex
这是字符串中模式匹配的一种语法,在django中就是url的匹配模式,Django 将请求的 URL 从上至下依次匹配列表中的正则表达式,直到匹配到一个为止。
但是这些url匹配并不匹配POST和GET方法对于 http://127.0.0.1:8009/jobs/和http://127.0.0.1:8009/jobs?page=3&pw=false url都只会匹配到jobs/。
url()参数view
当django匹配一个正则表达式就会调用指定的视图功能,包含一个HttpRequest实例作为第一个参数和正则表达式捕获的一些值作为其它参数,如果使用简单的正则捕获,将会按照顺序传递参数,如果按照命名捕获,将会按照关键字传递参数
url()参数kwargs
任意关键字参数可传一个字典至目标视图。在本教程中,我们并不打算使用 Django 这一特性。
url()参数name
命名你的
URL ,让你在 Django 的其他地方明确地引用它,特别是在模板中。 这一强大的功能可允许你通过一个文件就可全局修改项目中的 URL 模式。
编辑更多的视图
我们先在给jobs/views.py添加一些视图,这次添加上几个参数
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello,world.You are at the Register !")
def detail(request, r_id):
return HttpResponse("You're looking at register %s." % r_id)
def results(request, r_id):
return HttpResponse("You're looking at the results of register %s." % r_id)
def vote(request, r_id):
return HttpResponse("You're voting on register %s." % r_id)
然后再修改jobs/urls文件
from django.conf.urls import patterns,url
from jobs import views
urlpatterns=patterns('',
url(r'^$',views.index,name='index'),
url(r'^(?P<r_id>\d+)/$', views.detail, name='detail'),
url(r'^(?P<r_id>\d+)/results/$', views.results, name='results'),
url(r'^(?P<r_id>\d+)/vote/$', views.vote, name='vote'),
)
先在在浏览器上打开
http://127.0.0.1:8009/jobs/34/vote/ http://127.0.0.1:8009/jobs/34/http://127.0.0.1:8009/jobs/http://127.0.0.1:8009/jobs/34/results/
就能看到刚刚的效果了
下面来解释一下关于这个过程
include()的想法是将URL作为即插即用处理,当访问/jobs/34/的时候,django会加载jobs.url来,因为rootUrlconfig里面配置好了其指向。
当用户访问jobs/34/是出现的过程:
django会寻找jobs的匹配
接着django会将jobs后面的文本34传递到jobs.urls做进一步处理,再将匹配r'^(P<r_id>\d+)/$'作为参数给detail视图处理 detail (requrst=<HttpRequrs object> ,r_id='34')
下面来说说添加一些实际的功能
每个视图之负责下面两个事件中的一件:回应HttpRequest一个HttpReponse对象,抛出异常,入 http404
你的视图可以读取数据库记录,或者不用。它可以使用一个模板系统,例如 Django 的 – 或者第三方的 Python 模板系统 – 或不用。它可以生成一个 PDF 文件,输出 XML , 即时创建 ZIP 文件, 你可以使用你想用的任何
Python 库来做你想做的任何事。
而django只要求一个回应和异常。
上一篇说道了admin下面能够列出注册的用户,下面我们来修改index视图,让他显示注册的用户
latest_jobs_list = Register.objects.order_by('time')
output = ', '.join([p.account for p in latest_jobs_list])
return HttpResponse(output)
先在刷新一下http://127.0.0.1:8009/jobs/注册的用户的用户名就出现了
在这就有了个问题,页面的设计是硬编码在视图中的。如果你想改变页面的外观,就必须修改这里的 Python 代码。因此,让我们使用 Django 的模板系统创建一个模板给视图用,就使页面设计从 Python 代码中 分离出来了。
首先,在jobs目录下创建一个templates目录。
Django 将会在那寻找模板。
在你刚才创建的``templates`` 目录下,另外创建个名为jobs的目录,并在其中创建一个index.html文件。换句话说,你的模板应该是jobs/templates/jobs/index.html由于知道如上所述的
app_directories 模板加载器是 如何运行的,你可以参考 Django 内的模板简单的作为 jobs/index.html 模板。
我们先修改views
from django.http import HttpResponse
from jobs.models import Register
from django.template import Context,loader
def index(request):
latest_jobs_list = Register.objects.order_by('time')
template=loader.get_template('jobs/index.html')
context=Context({
'latest_jobs_list':latest_jobs_list,
})
return HttpResponse(template.render(context))
然后我们修改index.html
<html>
<head>
<meta charset='utf-8'>
</head>
<body>
{% if latest_jobs_list %}
<ul>
{% for register in latest_jobs_list %}
<li><a href="/jobs/{{ register.id }}/">{{ register.account }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No jobs are available.</p>
{% endif %}
</body>
</html>
代码将加载 jobs/index.html 模板并传递一个 context 变量。 The context is a dictionary mapping template variable names to Python 该 context 变量是一个映射了 Python 对象到模板变量的字典。
在你的浏览器中加载 “/jobs/” 页,你应该看到一个列表,包含了在注册用户以及其详细的页面
render():render方法用于加载模板,就像php中smarty模板中的assign方法差不多
分享到:
相关推荐
Django学习笔记.pdf
django学习笔记django学习笔记django学习笔记
个人总结的Django学习笔记, 持续更新中。 目前只是总结了django的一部分学习逻辑。
一起学习django,希望对你有帮助
django学习笔记,包含安装、setting详解 admin自定义管理、数据类型、视图、restfromework、认证权限等
Django学习笔记月伴之夜,学习django的成果的代码演示
Django学习笔记--阉割版
b站学习千锋教育的django视频,其中的学习笔记
PythonDjango学习笔记Python简单运用(二).docx
django 学习笔记(1)—— python和web开发框架(csdn)————程序
学习Django框架时自己总结的文档,内含知识点,代码,案例。
本电子书是自己学习django的学习笔记,案例主要是通过django这个框架,来学习博客的搭建详细过程,本电子书为第一部分,后续会持续上传,有需要的朋友可以了解,相互学习。
django学习
django学习笔记,doc格式,共15章+sql操作命令。从别人的blog上自己复制粘贴下来整理好共享给大家。
Python编程:从入门到实践==》django学习笔记,learning_log项目。
PythonDjango学习笔记软件下载及安装(一).pdf
PythonDjango学习笔记软件下载及安装(一)参照.pdf