`
runfeel
  • 浏览: 899343 次
文章分类
社区版块
存档分类
最新评论

Django学习笔记(四)

 
阅读更多

我们接着上面的文章来继续,现在我们来专注创建公共页面 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方法差不多

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics