DjangoStepByStep -- 一步接一步实例学习 DjanGo

::-- ZoomQuiet [2005-12-31 06:40:36]

啄木鸟项目::

{*} DjangoStepByStep

{o} 开放图书计划

1. 缘起

大家都是知道DjanGo 好东西,但是一下子转不过思想来,那未……

我在想,KarriGell 与 DjanGo 的开发体验到底差别在哪里,为什么 DjanGo 给我的感觉还不是那么清晰直观呢?于是我想从最最简单的例子做起,并且记录下来。 -- limodou

1.1. 教程日志

<< <  2012 / 3 >  >>
Mon Tue Wed Thu Fri Sat Sun
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

CPUG联盟::

CPUG::门户plone

BPUG

SPUG

ZPUG

SpreadPython Python宣传

提要

1.2. 成果

 在本文中我列举了一个最简单的hello,django的例子,有兴趣看一看,你可以先不知道django的model, admin,
 template,就是一个最简单的 hello, 看如何使用django做一个。

1.3. 学员体验

ZoomQuietDjanGo 体验学习历程

::-- ZoomQuiet [2005-12-31 06:55:32]

我的体验环境:: {{{Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. }}}+DjanGo SVN 1587 zDjango-1587.png

1.4. LiClass1:Hollo world!

  • 果然有挫折!
    1. 安装 0.90 版本,没有木头所言 manage.py

    2. 追回一步一步学习(一) 一看才明白,要SVN Trunk版本的!呜乎哀哉!你怎么不说清楚哪!

{{{[F:\zDevelop\_Zoomq\Django\tryfirst]py manage.py runserver Validating models... 0 errors found.

Starting server on port 8000 with settings module 'tryfirst.settings'. Go to http://127.0.0.1:8000/ for Django. Quit the server with CONTROL-C (Unix) or CTRL-BREAK (Windows). }}}

snap-tryDjango-1-0.png

  • 哈哈哈!!有用!
  • apps ???
    1. snap-tryDjango-1-leo.png

    2. 使用 Leo 组织一下子,明确项目结构,开始!

snap-tryDjango-1-1-hollo.png

  • 为什么?!urls.py 中

        # (r'^tryfirst/', include('tryfirst.apps.foo.urls.foo')),
        (r'^$', 'hollo.index'),
  • 看着 example 再尝试

    (r'^$', include('tryfirst.apps.hollo.index')),

snap-tryDjango-1-2-hollo.png

  • KAO!!也不成?!难道是

    (r'^$', 'tryfirst.apps.hollo.index'),

snap-tryDjango-1-done.png DONE! limodou!! 你为什么不说明白哪!!好歹也测试一下子哪!!!

1.4.1. 小节

初体验,感觉 Django 的调试信息比KarriGell 还要漂亮哪!! 写应用页面变成了一个应用插件的注册过程,嗯嗯,有些向官僚式的八股文写作了,好!是俺组织标准化KarriGell web 应用的一种示范!

1.5. LiClass2:加法器?

准备开始玩味 MTV (Model Template View) 按照说明一下子就成功了! snap-tryDjango-2-0.png 当然,没有使用 LiModou 说的那种 url 声明,追加的是: {{{(r'^add/$', 'tryfirst.apps.add.index'),

  • }}}

1.5.1. 调试?!

POST 看起来是个内置对象,想法子输出看一下子!

   1 def index(request):    
   2     if request.POST.has_key('a'):
   3         a = int(request.POST['a'])
   4         b = int(request.POST['b'])
   5     else:
   6         a = 0
   7         b = 0
   8     return HttpResponse(text%(a
   9                             , b
  10                             , (a + b)
  11                             ,request.POST
  12                             )
  13                         )

当然的,在充当模板的text 部分要追加</form>debug::%s""" 

  • 唉呀呀??怎么没有输出!?
  • 对了是HTML 页面,可能有问题,看源代码!果然有了...

snap-tryDjango-2-debug.png

1.5.2. 恶搞

哈哈哈!!这样调试可以的话,那未将输出部分修改一下子:

   1     return HttpResponse(text%(a
   2                             , b
   3                             , (a + b)
   4                             ,"dict4ini:%s : %s+%s=%s"%(str(r)
   5                                     ,str(r.a)
   6                                     ,str(r.b)
   7                                     ,str(int(r.a)+int(r.b))
   8                                     )
   9                             )
  10                         )

r 是什么呢?!r = DictIni(values=request.POST) 哈哈哈!使用 LiModou 的 dict4ini 模块!解析一下子dict 为对象,容易引用哪! snap-tryDjango-2-1.png 可用!是也乎^__^

1.5.3. URL 规则

没有详细说明下去的,url_conf,不知道是否有Apache mod_rewrite 的神奇? 比如说:http://localhost:8000/foo?action=edit&user=zoomq 可以通过:http://localhost:8000/foo/zoomq/edit 来访问得到?

1.6. LiClass3:MTV初步

触及 MTV (Model Template View)

  • 设置 T 目录先!
  • 顺手将国际化的设置查明了

    TIME_ZONE = 'Asia/Shanghai PRC'
    LANGUAGE_CODE = 'zh-cn'
    居然没有Bei Jing!! 唉呀呀...

刷! :snap-tryDjango-3-0.png 立即就有了; 嗯嗯,从现在开始每个应用都要修改三个文件:

  1. apps 中行动脚本
  2. templates 中输出模板
  3. urls.py 访问入口声明
    • 唉呀呀?这么一说...

          (r'^list/$', 'tryfirst.apps.list.index'),
          (r'^li/$', 'tryfirst.apps.list.index'),
      这样一来就可以方便的将相同的活动发布为不同的访问?!
    果然一试就成!赞!!

1.7. LiClass4:csv输出

进一步的 View操作

获取 request <--> DjanGo <--> response 输出

唉呀呀!简直就是MoinMoin 的页面处置流程哪!

  • row.0|addslashes 管道定向技术哪!-)

snap-tryDjango-4-0.png

  • 神奇哪!! URL 策略发挥了作用!
  • 不过,跟多个行为产生了关联有点混乱的说...
    1. Context 对象是 DjanGo 内含特定的处理对象;

    2. Context 对象实例必须是字典
    3. Context 对象的字典关键字将用以在模板中进行引用的
    4. response = HttpResponse(mimetype='text/csv')
      response['Content-Disposition'] = 'attachment;filename=%s.csv'filename
      两句约定了下载时的文件名
    5. 实际数据输出还是response.write(t.render(c))完成渲染

1.7.1. 小节

呜乎哀哉...理解,还是不管细节,成功就好? 现在开始是个分水岭了...


  • 数据可以组织为字典,但对于每个对象,却仍然可以调用它的方法。比如 a 有一个 getname 的方法,可以在模板中这样 a.getname。因此django有一种调用的策略,非常灵活。 -- limodou

2. 反馈

项目讨论

DjangoStepByStep (last edited 2009-12-25 07:19:14 by localhost)