SlideShare a Scribd company logo
Django Development
              Draft

          Leon Dong
          Liming_Do(at)smics.com




                     
Django 1.0 beta 2
    ●
        简介
    ●
        安装
    ●
        开始开发
    ●   定义 Model
    ●   定义 Form
    ●   开发 Views
    ●   编写 Template
    ●
        新的期待
                       
1. 简介
    ●   Django 是一个强大柔韧的 Web 系统开发框架
    ●   使用编程语言 Python 开发
    ●
        全面与整合的各项功能
    ●
        快速并简化的开发流程
    ●
        帮助你快速开发项目和应用
    ●   语言好 , 思想好 , 设计好 , 实现好 , 测试好




                        
2. 安装
    ●
        下载并安装
        Python(http://www.python.org)
    ●
        下载并安装
        Django(http://www.djangoproject.com)
    ●   安装命令 :
        python setup.py install




                                   
3. 开始开发
    ●   3.1. 创建项目
        ●
            使用命令
            python django­admin.py startproject myproject
        ●
            获得帮助
            python django­admin.py startproject –help
        ●
            项目目录结构
            ­ myproject
            |­ __init__.py  # 表明这个目录是一个 Python package
            |­ settings.py   # Django 项目的设置和配置文件
            |­ urls.py         # Django 项目的 URL 声名和配置文件
            |­ manage.py  # 与 Django 项目交互的命令行工具
                                       
3.2. 运行开发服务器
    ●
        使用命令
        python manage.py runserver
    ●
        获得帮助
        python manage.py runserver ­­help
    ●
        指定机器名称和端口
        python manage.py runserver servername:port
    ●
        访问地址
        http://servername:port
        可以看到一个默认的欢迎页面

                                
3.3. 创建应用
    ●
        使用命令
        python manage.py startapp myapp
    ●
        获得帮助
        python manage.py startapp –help
    ●
        应用目录结构
        ­ myproject
        |­ myapp
            |­ __init__.py #  表明目录是一个 Python package
            |­ models.py   #  模型定义文件,根据模型定义生成数据库结构

                                
3.4. 设置数据库
    ●   编辑 settings.py,  指定数据库引擎、数据库名称
        等配置项目
    ●
        配置开发数据库
        DATABASE_ENGINE = 'sqlite3'
        DATABASE_NAME = 'myproject.db'
    ●
        也可以设置为
        'postgresql_psycopg2', 'postgresql', 'mysql', 
        'ado_mssql'



                                   
3.5. 激活应用
    ●   编辑 settings.py ,添加应用的 package, 将使服务
        器启动时自动加载应用
        INSTALLED_APPS = (
                'django.contrib.auth',
                'django.contrib.contenttypes',
                'django.contrib.sessions',
                'django.contrib.sites',
                'myproject.myapp',
        )


                           
3.6. 配置 URL 映射
    ●   每当 Django 收到 Request, 它将根据 URL 映射的
        模式 (URL pattern) 匹配到视图 (views.py) 中的回
        调函数 .
    ●   Django 从上到下逐个进行模式匹配 , 当遇到第一
        个匹配的模式后停止 , 调用相应的视图方法处理
        Request.
    ●




                          
3.6. 配置 URL 映射
    ●   编辑项目目录下的 urls.py
    ●   增加 myapp 的 URL 映射
        urlpatterns = patterns('',
                # My App:
                (r'^myapp/', include('myproject.myapp.urls')),
        )




                                   
3.6. 配置 URL 映射
    ●   在 myapp 目录下建立 urls.py
    ●   Django 使用正则表达式匹配 URL,  配置应用的
        URL 映射内容如下:

        from django.conf.urls.defaults import *

            urlpatterns = patterns('',
                (r'^entry/$', 'myapp.views.entry_list'),
                (r'^entry/(?P<object_id>d+)/$', 'myapp.views.entry_detail'),

        )


                                            
3.6. 配置 URL 映射
    ●   在模式中可以通过 (?P<name>pattern) 为组命名 ,
        上例中的 object_id 将作为第二个参数 , 传递到函
        数 entry_detail() 中 .
    ●   第一个参数为默认的 request ,因此
        myproject/myapp/views.py 中的函数声明将是 :

        def entry_detail(request, object_id):
                # ... write source code to handle request here
                pass

                                    
3.6. 配置 URL 映射
    ●   <New> 可以使用 url() 函数代替 tuple 处理 URL
        映射,并且可以为 URL pattern 命名 .

        urlpatterns = patterns('',

                # url(regex, view, kwargs=None, name=None, prefix='')

                # (r'^entry/$', 'myapp.views.entry_list'),
                url(r'^entry/$', 'myapp.views.entry_list', name='index­view'),

                (r'^entry/(?P<object_id>d+)/$', 'myapp.views.entry_detail'),

         )
                                            
3.7. 使用 Admin Site
    ●   编辑 settings.py 激活 Admin Site
        INSTALLED_APPS = (
                'django.contrib.auth',
                'django.contrib.contenttypes',
                'django.contrib.sessions',
                'django.contrib.sites',
                'django.contrib.admin',
                'myproject.myapp',
            )


                                    
3.7. 使用 Admin Site
    ●   编辑项目根目录下的 urls.py ,去掉 admin 前的注
        释符号
        from django.conf.urls.defaults import *

            # Uncomment the next two lines to enable the admin:
            from django.contrib import admin
            admin.autodiscover()

            urlpatterns = patterns('',
                # My App:
                (r'^myapp/', include('myproject.myapp.urls')),

                # Uncomment the next line for to enable the admin:
                (r'^admin/(.*)', admin.site.root),
            )                                  
3.7. 使用 Admin Site
    ●   使用命令 python manage.py syncdb
    ●   将自动创建 Admin Site 所需要的数据表,并可以
        创建管理员帐号
    ●
        再次运行开发服务器
    ●   访问 Admin Site http://servername:port/admin/ 
    ●   可以创建 User 和 Group 并设置权限




                                
4. 定义 Model
    ●   4.1. 快速举例
        ●   Model 是关系型数据在应用程序中的映射 . 通常数据
            库中的表和 Model 是相互对应的 . 表中的栏位表现为
            Model 中的属性
        ●   对于不需要存储在数据库表中的信息 ,  可以通过定义
            一个叫作 Meta 的 Model 的内类 (Inner Class) 来实现
        ●   Django 提供了通过 Model 自动生成数据库表和字段 , 
            并且访问操作数据的功能



                              
4.1. 快速举例
    ●   编辑 myapp 目录下的 models.py 定义 Model

        from django.db import models

        class Entry(models.Model):
                headline = models.CharField(max_length=255)
                body_text = models.TextField()
                pub_date = models.DateTimeField()



                                 
4.2. 定义 Fields & Relations
    ●   Django 有两方面对于字段命名的限制
         ●   一个是不能使用 python 的保留字 ( 如 : pass)
         ●
             另一个是字段的名字中不能存在两个或以上下划线
             ( 即 : __ ),Django 使用双下划线作为默认的查询符号
    ●
        使用命令
        python manage.py shell

        >>>from django.db import models
        >>>dir(models)
    ●    <New> 可使用 db_tablespace 选项代替 settings 中的
        DEFAULT_INDEX_TABLESPACE,    如果数据库不支持则被忽略
                                       
4.2. 定义 Fields & Relations
    ●   列举 fields:
    ●   AutoField
    ●   BooleanField
    ●   CharField
    ●   CommaSeparatedIntegerField
    ●   DateField
    ●   DateTimeField
    ●   DecimalField    <New> 固定精度十进制小数
                              可使用参数 max_digits 和 decimal_places
                                    
4.2. 定义 Fields & Relations
●    EmailField
●    FileField        <New> 使用 max_length 改变默认的 varchar(100)

●    FilePathField    <New> 使用 max_length 改变默认的 varchar(100)

●    FloatField       <Change> 表现为 Python 中的 float

●    IPAddressField
●    ImageField       <New> 使用 max_length 改变默认的 varchar(100)

●    IntegerField
●    NullBooleanField
 ●
     PhoneNumberField             
4.2. 定义 Fields & Relations
●    PositiveIntegerField
●    PositiveSmallIntegerField
●    SlugField
●    SmallIntegerField
●    TextField
●    TimeField
●    URLField
●    USStateField
 ●
     XMLField                 
4.2. 定义 Fields & Relations
    ●   列举 relationships:
    ●   OneToOneField       One­to­one relationships
    ●   ForeignKey              Many­to­one relationships
    ●   ManyToManyField  Many­to­many relationships
    ●   <New> 在另外一个 app 中引用当前 Model 中的
        类 ,  可以通过 applabel.classname 的方式 ,  如 : 
        auther = models.ForeignKey('auth.User') 


                                   
4.2. 定义 Fields & Relations
    ●   <New> 使用额外的类建立 ManyToMany 关联
        class Person(models.Model):
                name = models.CharField(max_length=128)

                def __unicode__(self):
                    return self.name
        class Group(models.Model):
                name = models.CharField(max_length=128)
                members = models.ManyToManyField(Person, through='Membership')

                def __unicode__(self):
                    return self.name

         class Membership(models.Model):
                person = models.ForeignKey(Person)
                group = models.ForeignKey(Group)
                date_joined = models.DateField()
                invite_reason = models.CharField(max_length=64)
                                                     
4.3.Model 继承 <New>
    ●   4.3.1. 抽象基类 (Abstract base classs)
        ●   使用抽象基类的方式实现类继承 ,  是用来提取一些
            Model 中的公用的字段放在一个不需要建立数据表的
            Model 中
        ●   基类的字段会被建立在子类的数据表中 .  通过在基类
            的内类 Meta 中声明 abstract=True 实现
            class CommonInfo(models.Model):
                    name = models.CharField(max_length=100)
                    age = models.PositiveIntegerField()
                
                    class Meta:
                        abstract = True
                
            class Student(CommonInfo):
                    home_group = models.CharField(max_length=5)
                                                  
4.3.2. 内类 Meta 继承
    ●   当一个抽象基类被建立的时候 , Django 使你声明
        的内类 Meta 作为抽象基类的一个可用的属性


    ●   如果其子类没有声明自己的内类 Meta,
        它将继承父类也就是抽象基类的内类 Meta




                      
4.3.2. 内类 Meta 继承
    ●   如果你想扩展抽象基类中的内类 Meta,  可以在子
        类中声明 Meta 继承抽象基类的内类 Meta

        class CommonInfo(models.Model):
                ...
                class Meta:
                    abstract = True
                    ordering = ['name']
            
         class Student(CommonInfo):
                ...
                class Meta(CommonInfo.Meta):
                    db_table = 'student_info'




                                                 
4.3.2. 内类 Meta 继承
    ●   Django 对抽象基类中的内类 Meta 会做一个判断 :
        在安装 Meta 作为属性之前 ,  先设置
        abatract=False
    ●
        这就意味着抽象基类的子类不会自己自动的成为
        抽象基类 , 当然可以通过 abstract=True 让一个抽
        象基类继承自另一个
    ●   需要注意一些属性不应该在抽象基类的 Meta 中
        被声明 ,  比如 db_table,  否则如果子类不声明自
        己的内类 Meta, 将意味着它们将都使用相同的数
        据库表 ,  这当然不是我们想要的 .
                        
4.3.2. 内类 Meta 继承
    ●
        需要注意在基类中使用
        ForeignKey,ManyToManyField 时的 related_name
        属性 ,  必须为它指定一个对于所有子类都唯一的
        反向引用的名字
        class Base(models.Model):
                m2m = models.ManyToMany(OtherModel, related_name="%(class)s_related")    
                class Meta:
                    abstract = True
            
         class ChildA(Base):
                pass
            
            class ChildB(Base):
                pass

                                                  
4.3.2. 内类 Meta 继承
    ●   如果没有在抽象基类中指定 related_name 属性 , 
        它将会自动使用子类的名字接一个 '_set'
    ●   以上面的代码为例 ,  对于 m2m 字段的反向引用
        的名字 ,  对于 ChildA 应该是 childa_set,  对于
        ChildB 应该是 childb_set




                          
4.3.3. 多表继承( Multi-table inheritance)
    ●    Django 支持的第二种 Model 继承类型是继承体
        系中的每一个 Model 都在数据库中建立自己的
        表 ,  父类和子类通过一个自动建立的
        OneToOneField 关联
        class Place(models.Model):
                name = models.CharField(max_length=50)
                address = models.CharField(max_length=80)
            
            class Restaurant(Place):
                serves_hot_dogs = models.BooleanField()
                serves_pizza = models.BooleanField()




                                                    
4.3.3. 多表继承( Multi-table inheritance)
    ●   如果一个 Place 同时也是一个 Restaurant,  虽然在
        数据库中他们使用不同的表 ,  依然可以通过任意
        一个 Model 使用语句对它进行查询 .
          >>> r = Restaurant(name="Bob's Cafe")
            >>> r.save()
            >>> Restaurant.objects.filter(name="Bob's Cafe")
            >>> p = Place.objects.filter(name="Bob's Cafe")

    ●   如果 p 同时也是 Restaurant,  那么你可以通过使用
        类名的小写直接访问
            >>> p.restaurant
            <Restaurant: ...>

    ●   如果 p 不是 Restaurant,  引用 p.restaurant 系统将
        会抛出一个 error           
4.3.4. 多表继承与 Meta 内类
    ●   在多表继承的情形下 ,  子类的内类 Meta 继承自
        父类的内类 Meta 是没有意义的 .  所有的 Meta 选
        项已经被应用到父类
    ●   再应用它们一次到子类 ,  通常情形下可能导致冲
        突的情况 .  所以一个子类不能访问它的父类的内
        类 Meta. 
    ●   但是也有一些情形下 ,  需要限制子类继承自父类
        的行为属性 : 
    ●   如果子类没有指定一个 ordering 属性或者
        get_latest_by 属性 , 它将从父类继承 .
                        
4.3.4. 多表继承与 Meta 内类
    ●   如果父类有排序 ordering 的属性,而你不想子类
        有任何的自然排序 ,  你可以明确的声明 ordering
        为空 :

            class ChildModel(ParentModel):
                ...
                class Meta:
                    # Remove parent's ordering effect
                    ordering = []


                                    
4.3.5. 继承和反向关联
    ●   因为多表继承使用一个隐含的 OneToOneField 连
        接父类与子类 ,  像上面的例子一样 , 从父类向下
        访问子类成为可能
    ●   但是这将耗尽 ForeignKey 和 ManyToManyField
        默认的 related_name 名字 .  如果你设置那些类型
        的关系到另一个 Model 的子类
    ●   你必须为每一个这样的字段指定 related_name 属
        性 .  如果你忘记 , Django 将在你运行 manage.py 
        validate 或 manage.py syncdb 时抛出一个 error

                           
4.3.5. 继承和反向关联
    ●   例如再一次使用类继承上面的 Place,  我们需要指
        定另一个 ManyToManyField 的 related_name:

        class Supplier(Place):

                # Must specify related_name on all relations.
                customers = models.ManyToManyField(Restaurant, related_name='provider')




                                                   
4.3.6. 指定 parent_link 属性
    ●   Django 会自动建立 OneToOneField 来连接你的子
        类到非抽象的父类的 Model,  如果你想要控制
        反向连接到父类的名字
    ●
        你可以指定自己的连接字段并且传给它一个
        parent_link=True 的参数 :

        class Supplier(Place):
                parent = models.OneToOneField(Place, parent_link=True)




                                       
4.3.7 多重继承
    ●   就像 Python 的继承体系一样 ,  你可以让 Django
        的子类 Model 继承自多个父类 Model, python 的
        标准继承命名分解规则也适用这里
    ●
        首个出现特定属性名字的基类将是真正使用的那
        一个 ,  一旦找到该名称就将停止继续搜索 .  这就
        意味着如果多个父类都包括 Meta 内类 ,  只有第
        一个的 Meta 内类将被使用 ,  其它的都将被忽略 .




                        
4.3.7 多重继承
    ●   一般情况下 ,  你的子类都不需要从多个父类继
        承 .  主要的用例是帮助实现 Mix­in 类 ,  增加一个
        独特的额外字段或方法到每一个继承 Mix­in 的子
        类
    ●
        如果你要避免不得不算出某个细节的信息是从哪
        里而来的麻烦,请保持你的 Model 继承体系尽可
        能的简单和直接 .




                        
4.4.Model 的 save/delete 编写
before/after 钩子
    ●   需要重载 save 或 delete 方法 ,  加入自己需要的
        before/after 代码 ,  并调用超类的 save 方法
        class Person(models.Model):
                first_name = models.CharField(max_length=20)
                last_name = models.CharField(max_length=20)

                def __unicode__(self):
                    return u"%s %s" % (self.first_name, self.last_name)

                def save(self):
                    print "Before save"
                    super(Person, self).save() # Call the "real" save() method
                    print "After save"

                def delete(self):
                    print "Before deletion"
 
                    super(Person, self).delete() # Call the "real" delete() method
                                                            
                    print "After deletion"
5. 定义 Form
    ●   Form
          表单是字段 (Field) 的集合 , 能够验证数据 , 生
        成模板所需要的 HTML
    ●   Field
           字段是一个负责做数据验证的类
    ●   Widget
          协助字段生成 HTML
    ●   Form Media
          定义表单所需要的 CSS 和 Javascript 等资源
                        
5.2. 定义 Form
    ●   Form 定义举例
        from django import forms
         class ContactForm(forms.Form):
                subject = forms.CharField(max_length=100)
                message = forms.CharField()
                sender = forms.EmailField()
                cc_myself = forms.BooleanField(required=False)

    ●   Form 输入 HTML,  使用 as_p(),as_table(),as_li()
        >>>form.as_p
           <form action="/contact/" method="POST">
           <p><label for="id_subject">Subject:</label>
        <input id="id_subject" type="text" name="subject" maxlength="100" /></p>
           <p><label for="id_message">Message:</label><input type="text" name="message" id="id_message" /></p>
           <p><label for="id_sender">Sender:</label><input type="text" name="sender" id="id_sender" /></p>
           <p><label for="id_cc_myself">Cc myself:</label><input type="checkbox" name="cc_myself" 
        id="id_cc_myself" /></p>
           <input type="submit" value="Submit"></form>


                                                         
5.3. 使用 ModelForm
    ●   如果我们开发的是一个数据库驱动的应用 ,  我们
        可能希望 Form 能够直接和 Model 绑定在一起 , 
        那么就可以直接使用 ModelForm
        from django.forms import ModelForm

        class ArticleForm(ModelForm):
            class Meta:
                model = Article

        >>> article = Article.objects.get(pk=1)
        >>> form = ArticleForm(instance=article)
        >>> f.save()
                                      
6. 开发 Views
    ●   Django 提倡 Model Template View 的开发方式
    ●   Views 是编写的处理业务逻辑和表单提交的函数
    ●   ­ myproject
        |­ myapp
            |­ __init__.py #  表明目录是一个 Python package
            |­ models.py   #  模型定义文件,根据模型定义生成数据库结构
             |­ views.py     #   视图方法定义
             |­ forms.py     #   表单定义
             |­ admin.py    #   定义 ModelAdmin 

                                
6.2. 通用视图 Generic Views
    ●
        帮助我们处理三类问题
    ●   处理 list/detail
    ●   处理基于时间的归档页面 ,  如 blog 的时间归档
    ●   处理 model 的 creating, editing, deleting 
    ●
        举例
        from django.views.generic.list_detail imort object_list, object_detail

        def entry_list(request):
             return object_list(request, Entry.objects.get_query_set(), paginate_by=10) 



                                                      
7. 编写 Template
    ●   编辑项目目录下的 settings.py
            TEMPLATE_DIRS = (
                "/home/my_username/mytemplates", # Change this to your own directory.)

    ●   模板可以继承 {% extends "base.html" %}
    ●   复杂的代码编写自己的 templatetag
        from django import template
        register = template.Library()
        def paginator_number(cl,i):
            if i =='.':  return u'... '
            elif i == cl.page_num: return mark_safe(u'<span class="this­page">%d</span> ' % (i+1))
            else:
                return mark_safe(u'<a href="%s"%s>%d</a> ' % (cl.get_query_string({PAGE_VAR: 
                     i}), (i == cl.paginator.num_pages­1 and ' class="end"' or ''), i+1))

        paginator_number = register.simple_tag(paginator_number)

                                                    
对 Django 新功能的期待
    ●   Multi Data Source ORM
        最希望 Django 能够支持多数据源的对象关系映
        射,真正企业中的应用大多存在多个数据源




                     
Thank You




         

More Related Content

What's hot

常見設計模式介紹
常見設計模式介紹常見設計模式介紹
常見設計模式介紹
Jace Ju
 
Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则
YUCHENG HU
 
Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要yiditushe
 
jsp基础速成精华讲解
jsp基础速成精华讲解jsp基础速成精华讲解
jsp基础速成精华讲解wensheng wei
 
浏览器工作原理浅析
浏览器工作原理浅析浏览器工作原理浅析
浏览器工作原理浅析癸鑫 张
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档yiditushe
 
Django
DjangoDjango
DjangoTao He
 

What's hot (9)

常見設計模式介紹
常見設計模式介紹常見設計模式介紹
常見設計模式介紹
 
Js培训
Js培训Js培训
Js培训
 
Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则Moodle 项目帮助手册:程序编写准则
Moodle 项目帮助手册:程序编写准则
 
Spring入门纲要
Spring入门纲要Spring入门纲要
Spring入门纲要
 
jsp基础速成精华讲解
jsp基础速成精华讲解jsp基础速成精华讲解
jsp基础速成精华讲解
 
浏览器工作原理浅析
浏览器工作原理浅析浏览器工作原理浅析
浏览器工作原理浅析
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
 
Django
DjangoDjango
Django
 
SCJP ch09
SCJP ch09SCJP ch09
SCJP ch09
 

Viewers also liked

Optimizer operators
Optimizer operatorsOptimizer operators
Optimizer operators
Zhaoyang Wang
 
Prototyping is an attitude
Prototyping is an attitudePrototyping is an attitude
Prototyping is an attitude
With Company
 
50 Essential Content Marketing Hacks (Content Marketing World)
50 Essential Content Marketing Hacks (Content Marketing World)50 Essential Content Marketing Hacks (Content Marketing World)
50 Essential Content Marketing Hacks (Content Marketing World)
Heinz Marketing Inc
 
10 Insightful Quotes On Designing A Better Customer Experience
10 Insightful Quotes On Designing A Better Customer Experience10 Insightful Quotes On Designing A Better Customer Experience
10 Insightful Quotes On Designing A Better Customer Experience
Yuan Wang
 
How to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanHow to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media Plan
Post Planner
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
In a Rocket
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting Personal
Kirsty Hulse
 

Viewers also liked (7)

Optimizer operators
Optimizer operatorsOptimizer operators
Optimizer operators
 
Prototyping is an attitude
Prototyping is an attitudePrototyping is an attitude
Prototyping is an attitude
 
50 Essential Content Marketing Hacks (Content Marketing World)
50 Essential Content Marketing Hacks (Content Marketing World)50 Essential Content Marketing Hacks (Content Marketing World)
50 Essential Content Marketing Hacks (Content Marketing World)
 
10 Insightful Quotes On Designing A Better Customer Experience
10 Insightful Quotes On Designing A Better Customer Experience10 Insightful Quotes On Designing A Better Customer Experience
10 Insightful Quotes On Designing A Better Customer Experience
 
How to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media PlanHow to Build a Dynamic Social Media Plan
How to Build a Dynamic Social Media Plan
 
Learn BEM: CSS Naming Convention
Learn BEM: CSS Naming ConventionLearn BEM: CSS Naming Convention
Learn BEM: CSS Naming Convention
 
SEO: Getting Personal
SEO: Getting PersonalSEO: Getting Personal
SEO: Getting Personal
 

Similar to Django development

Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
Chi-wen Sun
 
Chapter 4 models
Chapter 4 modelsChapter 4 models
Chapter 4 models
Ekman Hsieh
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯liuts
 
Nginx使用和模块开发
Nginx使用和模块开发Nginx使用和模块开发
Nginx使用和模块开发
qingpiao1983
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统
klandor
 
Django step0
Django step0Django step0
Django step0
永昇 陳
 
Django入门
Django入门Django入门
Django入门oikomi
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.x
Bo-Yi Wu
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
zhangsuoyong
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
Will Huang
 
轻量级Flash服务器开发框架(刘恒)
轻量级Flash服务器开发框架(刘恒)轻量级Flash服务器开发框架(刘恒)
轻量级Flash服务器开发框架(刘恒)FLASH开发者交流会
 
Introduction to CodeIgniter
Introduction to CodeIgniterIntroduction to CodeIgniter
Introduction to CodeIgniterChun-Kai Wang
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf
ssuserd6c7621
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kaoxwcoder
 
Kissy design
Kissy designKissy design
Kissy design
yiming he
 
希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范Hongjian Wang
 
Drupal 版型設計 - 瞭解版型程式
Drupal 版型設計 - 瞭解版型程式Drupal 版型設計 - 瞭解版型程式
Drupal 版型設計 - 瞭解版型程式Chris Wu
 
Magento页面载入的执行流程
Magento页面载入的执行流程Magento页面载入的执行流程
Magento页面载入的执行流程Sim Jiason
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架fangdeng
 

Similar to Django development (20)

Backbone js and requirejs
Backbone js and requirejsBackbone js and requirejs
Backbone js and requirejs
 
Chapter 4 models
Chapter 4 modelsChapter 4 models
Chapter 4 models
 
Django敏捷开发 刘天斯
Django敏捷开发 刘天斯Django敏捷开发 刘天斯
Django敏捷开发 刘天斯
 
Nginx使用和模块开发
Nginx使用和模块开发Nginx使用和模块开发
Nginx使用和模块开发
 
开源应用日志收集系统
开源应用日志收集系统开源应用日志收集系统
开源应用日志收集系统
 
Django step0
Django step0Django step0
Django step0
 
Php
Php Php
Php
 
Django入门
Django入门Django入门
Django入门
 
Introduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.xIntroduction to MVC of CodeIgniter 2.1.x
Introduction to MVC of CodeIgniter 2.1.x
 
张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
 
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
使用 TypeScript 駕馭 Web 世界的脫韁野馬:以 Angular 2 開發框架為例
 
轻量级Flash服务器开发框架(刘恒)
轻量级Flash服务器开发框架(刘恒)轻量级Flash服务器开发框架(刘恒)
轻量级Flash服务器开发框架(刘恒)
 
Introduction to CodeIgniter
Introduction to CodeIgniterIntroduction to CodeIgniter
Introduction to CodeIgniter
 
4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf4. Go 工程化实践-0124-v2.pdf
4. Go 工程化实践-0124-v2.pdf
 
Template mb-kao
Template mb-kaoTemplate mb-kao
Template mb-kao
 
Kissy design
Kissy designKissy design
Kissy design
 
希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范希望科技研发部变量命名及编码规范
希望科技研发部变量命名及编码规范
 
Drupal 版型設計 - 瞭解版型程式
Drupal 版型設計 - 瞭解版型程式Drupal 版型設計 - 瞭解版型程式
Drupal 版型設計 - 瞭解版型程式
 
Magento页面载入的执行流程
Magento页面载入的执行流程Magento页面载入的执行流程
Magento页面载入的执行流程
 
J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架J engine -构建高性能、可监控的前端应用框架
J engine -构建高性能、可监控的前端应用框架
 

Recently uploaded

20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
jhujyunjhang
 
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
jhujyunjhang
 
constitution_law_constitution_law_1234567
constitution_law_constitution_law_1234567constitution_law_constitution_law_1234567
constitution_law_constitution_law_1234567
ssusere1a91f
 
constitution_law_constitution_law_123456
constitution_law_constitution_law_123456constitution_law_constitution_law_123456
constitution_law_constitution_law_123456
ssusere1a91f
 
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
趙 亨利
 
wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_
wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_
wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_
ssusere1a91f
 
🚀改挂科绩点,留学成绩轻松搞定!|找黑客帮忙?太酷了吧~ 🎉🔥 |再也不用担心考试挂科啦【微信:oojjiijj】
🚀改挂科绩点,留学成绩轻松搞定!|找黑客帮忙?太酷了吧~ 🎉🔥 |再也不用担心考试挂科啦【微信:oojjiijj】🚀改挂科绩点,留学成绩轻松搞定!|找黑客帮忙?太酷了吧~ 🎉🔥 |再也不用担心考试挂科啦【微信:oojjiijj】
🚀改挂科绩点,留学成绩轻松搞定!|找黑客帮忙?太酷了吧~ 🎉🔥 |再也不用担心考试挂科啦【微信:oojjiijj】
微信 oojjiijj 接单
 
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
jhujyunjhang
 
澳门大学成绩修改,1小时快速搞定!💡 苦于提交资料太晚?雅思分数迟迟不达标?别担心,我们的专业团队为您量身定制个性化解决方案。只需10分钟,轻松修改【微信...
澳门大学成绩修改,1小时快速搞定!💡 苦于提交资料太晚?雅思分数迟迟不达标?别担心,我们的专业团队为您量身定制个性化解决方案。只需10分钟,轻松修改【微信...澳门大学成绩修改,1小时快速搞定!💡 苦于提交资料太晚?雅思分数迟迟不达标?别担心,我们的专业团队为您量身定制个性化解决方案。只需10分钟,轻松修改【微信...
澳门大学成绩修改,1小时快速搞定!💡 苦于提交资料太晚?雅思分数迟迟不达标?别担心,我们的专业团队为您量身定制个性化解决方案。只需10分钟,轻松修改【微信...
微信 oojjiijj 接单
 
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
jhujyunjhang
 
constitution_basic_right_constitution_basic_right
constitution_basic_right_constitution_basic_rightconstitution_basic_right_constitution_basic_right
constitution_basic_right_constitution_basic_right
ssusere1a91f
 
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
jhujyunjhang
 
constitution_people_constitution_people_
constitution_people_constitution_people_constitution_people_constitution_people_
constitution_people_constitution_people_
ssusere1a91f
 
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
jhujyunjhang
 
作为一个黑客,你是不是也有这样的困扰? 🤔成绩不够好怎么办呢?不要灰心哦!也许我们可以利用一些小技巧来让它变得更好看。🔍🖋 #hack #college ...
作为一个黑客,你是不是也有这样的困扰? 🤔成绩不够好怎么办呢?不要灰心哦!也许我们可以利用一些小技巧来让它变得更好看。🔍🖋 #hack #college ...作为一个黑客,你是不是也有这样的困扰? 🤔成绩不够好怎么办呢?不要灰心哦!也许我们可以利用一些小技巧来让它变得更好看。🔍🖋 #hack #college ...
作为一个黑客,你是不是也有这样的困扰? 🤔成绩不够好怎么办呢?不要灰心哦!也许我们可以利用一些小技巧来让它变得更好看。🔍🖋 #hack #college ...
微信 oojjiijj 接单
 
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
jhujyunjhang
 
黑客篡改成绩单?这可是真事儿!🔍 实测过程全程曝光,你我皆知。一起来看看这个神奇操作吧~ 🎬【微信:oojjiijj】
黑客篡改成绩单?这可是真事儿!🔍 实测过程全程曝光,你我皆知。一起来看看这个神奇操作吧~ 🎬【微信:oojjiijj】黑客篡改成绩单?这可是真事儿!🔍 实测过程全程曝光,你我皆知。一起来看看这个神奇操作吧~ 🎬【微信:oojjiijj】
黑客篡改成绩单?这可是真事儿!🔍 实测过程全程曝光,你我皆知。一起来看看这个神奇操作吧~ 🎬【微信:oojjiijj】
微信 oojjiijj 接单
 
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
jhujyunjhang
 
constitution_central_local_constitution_central_local
constitution_central_local_constitution_central_localconstitution_central_local_constitution_central_local
constitution_central_local_constitution_central_local
ssusere1a91f
 
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
jhujyunjhang
 

Recently uploaded (20)

20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
20240520-敏感資料處理原則-柯智仁.pptx.pdf_20240520-敏感資料處理原則-柯智仁.pptx.pdf
 
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
20230913 資料發布類型-陳建文.pdf_20230913 資料發布類型-陳建文.pdf
 
constitution_law_constitution_law_1234567
constitution_law_constitution_law_1234567constitution_law_constitution_law_1234567
constitution_law_constitution_law_1234567
 
constitution_law_constitution_law_123456
constitution_law_constitution_law_123456constitution_law_constitution_law_123456
constitution_law_constitution_law_123456
 
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
台科大史懷哲團隊研習課程(專題課程發展分享 以Arduino專案實作出發)20240613
 
wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_
wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_
wolf_wolf_wolf_wolf_wolf_wolf_wolf_wolf_
 
🚀改挂科绩点,留学成绩轻松搞定!|找黑客帮忙?太酷了吧~ 🎉🔥 |再也不用担心考试挂科啦【微信:oojjiijj】
🚀改挂科绩点,留学成绩轻松搞定!|找黑客帮忙?太酷了吧~ 🎉🔥 |再也不用担心考试挂科啦【微信:oojjiijj】🚀改挂科绩点,留学成绩轻松搞定!|找黑客帮忙?太酷了吧~ 🎉🔥 |再也不用担心考试挂科啦【微信:oojjiijj】
🚀改挂科绩点,留学成绩轻松搞定!|找黑客帮忙?太酷了吧~ 🎉🔥 |再也不用担心考试挂科啦【微信:oojjiijj】
 
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
20240522-如何下載與引用TBIA資料-張俊怡.pdf_20240522-如何下載與引用TBIA資料-張俊怡.pdf
 
澳门大学成绩修改,1小时快速搞定!💡 苦于提交资料太晚?雅思分数迟迟不达标?别担心,我们的专业团队为您量身定制个性化解决方案。只需10分钟,轻松修改【微信...
澳门大学成绩修改,1小时快速搞定!💡 苦于提交资料太晚?雅思分数迟迟不达标?别担心,我们的专业团队为您量身定制个性化解决方案。只需10分钟,轻松修改【微信...澳门大学成绩修改,1小时快速搞定!💡 苦于提交资料太晚?雅思分数迟迟不达标?别担心,我们的专业团队为您量身定制个性化解决方案。只需10分钟,轻松修改【微信...
澳门大学成绩修改,1小时快速搞定!💡 苦于提交资料太晚?雅思分数迟迟不达标?别担心,我们的专业团队为您量身定制个性化解决方案。只需10分钟,轻松修改【微信...
 
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
20220317-開放授權規範-林誠夏.pdf_20220317-開放授權規範-林誠夏.pdf
 
constitution_basic_right_constitution_basic_right
constitution_basic_right_constitution_basic_rightconstitution_basic_right_constitution_basic_right
constitution_basic_right_constitution_basic_right
 
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
20230513-datapaper-何芷蔚.pdf_20230513-datapaper-何芷蔚.pdf
 
constitution_people_constitution_people_
constitution_people_constitution_people_constitution_people_constitution_people_
constitution_people_constitution_people_
 
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
20220325-如何下載與引用資料-柯智仁.pdf_20220325-如何下載與引用資料-柯智仁.pdf
 
作为一个黑客,你是不是也有这样的困扰? 🤔成绩不够好怎么办呢?不要灰心哦!也许我们可以利用一些小技巧来让它变得更好看。🔍🖋 #hack #college ...
作为一个黑客,你是不是也有这样的困扰? 🤔成绩不够好怎么办呢?不要灰心哦!也许我们可以利用一些小技巧来让它变得更好看。🔍🖋 #hack #college ...作为一个黑客,你是不是也有这样的困扰? 🤔成绩不够好怎么办呢?不要灰心哦!也许我们可以利用一些小技巧来让它变得更好看。🔍🖋 #hack #college ...
作为一个黑客,你是不是也有这样的困扰? 🤔成绩不够好怎么办呢?不要灰心哦!也许我们可以利用一些小技巧来让它变得更好看。🔍🖋 #hack #college ...
 
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
20240520-TaiBIF和GBIF介紹-劉璟儀.pdf_20240520-TaiBIF和GBIF介紹-劉璟儀.pdf
 
黑客篡改成绩单?这可是真事儿!🔍 实测过程全程曝光,你我皆知。一起来看看这个神奇操作吧~ 🎬【微信:oojjiijj】
黑客篡改成绩单?这可是真事儿!🔍 实测过程全程曝光,你我皆知。一起来看看这个神奇操作吧~ 🎬【微信:oojjiijj】黑客篡改成绩单?这可是真事儿!🔍 实测过程全程曝光,你我皆知。一起来看看这个神奇操作吧~ 🎬【微信:oojjiijj】
黑客篡改成绩单?这可是真事儿!🔍 实测过程全程曝光,你我皆知。一起来看看这个神奇操作吧~ 🎬【微信:oojjiijj】
 
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
20230913-資料標準-劉璟儀.pdf_20230913-資料標準-劉璟儀.pdf
 
constitution_central_local_constitution_central_local
constitution_central_local_constitution_central_localconstitution_central_local_constitution_central_local
constitution_central_local_constitution_central_local
 
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
20240521-開放資料的前置準備與清理-楊富鈞.pdf_20240521-開放資料的前置準備與清理-楊富鈞.pdf
 

Django development

  • 1. Django Development Draft Leon Dong Liming_Do(at)smics.com    
  • 2. Django 1.0 beta 2 ● 简介 ● 安装 ● 开始开发 ● 定义 Model ● 定义 Form ● 开发 Views ● 编写 Template ● 新的期待    
  • 3. 1. 简介 ● Django 是一个强大柔韧的 Web 系统开发框架 ● 使用编程语言 Python 开发 ● 全面与整合的各项功能 ● 快速并简化的开发流程 ● 帮助你快速开发项目和应用 ● 语言好 , 思想好 , 设计好 , 实现好 , 测试好    
  • 4. 2. 安装 ● 下载并安装 Python(http://www.python.org) ● 下载并安装 Django(http://www.djangoproject.com) ● 安装命令 : python setup.py install    
  • 5. 3. 开始开发 ● 3.1. 创建项目 ● 使用命令 python django­admin.py startproject myproject ● 获得帮助 python django­admin.py startproject –help ● 项目目录结构 ­ myproject |­ __init__.py  # 表明这个目录是一个 Python package |­ settings.py   # Django 项目的设置和配置文件 |­ urls.py         # Django 项目的 URL 声名和配置文件 |­ manage.py  # 与 Django 项目交互的命令行工具    
  • 6. 3.2. 运行开发服务器 ● 使用命令 python manage.py runserver ● 获得帮助 python manage.py runserver ­­help ● 指定机器名称和端口 python manage.py runserver servername:port ● 访问地址 http://servername:port 可以看到一个默认的欢迎页面    
  • 7. 3.3. 创建应用 ● 使用命令 python manage.py startapp myapp ● 获得帮助 python manage.py startapp –help ● 应用目录结构 ­ myproject |­ myapp     |­ __init__.py #  表明目录是一个 Python package     |­ models.py   #  模型定义文件,根据模型定义生成数据库结构    
  • 8. 3.4. 设置数据库 ● 编辑 settings.py,  指定数据库引擎、数据库名称 等配置项目 ● 配置开发数据库 DATABASE_ENGINE = 'sqlite3' DATABASE_NAME = 'myproject.db' ● 也可以设置为 'postgresql_psycopg2', 'postgresql', 'mysql',  'ado_mssql'    
  • 9. 3.5. 激活应用 ● 编辑 settings.py ,添加应用的 package, 将使服务 器启动时自动加载应用 INSTALLED_APPS = (         'django.contrib.auth',         'django.contrib.contenttypes',         'django.contrib.sessions',         'django.contrib.sites',         'myproject.myapp', )    
  • 10. 3.6. 配置 URL 映射 ● 每当 Django 收到 Request, 它将根据 URL 映射的 模式 (URL pattern) 匹配到视图 (views.py) 中的回 调函数 . ● Django 从上到下逐个进行模式匹配 , 当遇到第一 个匹配的模式后停止 , 调用相应的视图方法处理 Request. ●    
  • 11. 3.6. 配置 URL 映射 ● 编辑项目目录下的 urls.py ● 增加 myapp 的 URL 映射 urlpatterns = patterns('',         # My App:         (r'^myapp/', include('myproject.myapp.urls')), )    
  • 12. 3.6. 配置 URL 映射 ● 在 myapp 目录下建立 urls.py ● Django 使用正则表达式匹配 URL,  配置应用的 URL 映射内容如下: from django.conf.urls.defaults import *     urlpatterns = patterns('',         (r'^entry/$', 'myapp.views.entry_list'),         (r'^entry/(?P<object_id>d+)/$', 'myapp.views.entry_detail'), )    
  • 13. 3.6. 配置 URL 映射 ● 在模式中可以通过 (?P<name>pattern) 为组命名 , 上例中的 object_id 将作为第二个参数 , 传递到函 数 entry_detail() 中 . ● 第一个参数为默认的 request ,因此 myproject/myapp/views.py 中的函数声明将是 : def entry_detail(request, object_id):         # ... write source code to handle request here         pass    
  • 14. 3.6. 配置 URL 映射 ● <New> 可以使用 url() 函数代替 tuple 处理 URL 映射,并且可以为 URL pattern 命名 . urlpatterns = patterns('',         # url(regex, view, kwargs=None, name=None, prefix='')         # (r'^entry/$', 'myapp.views.entry_list'),         url(r'^entry/$', 'myapp.views.entry_list', name='index­view'),         (r'^entry/(?P<object_id>d+)/$', 'myapp.views.entry_detail'),  )    
  • 15. 3.7. 使用 Admin Site ● 编辑 settings.py 激活 Admin Site INSTALLED_APPS = (         'django.contrib.auth',         'django.contrib.contenttypes',         'django.contrib.sessions',         'django.contrib.sites',         'django.contrib.admin',         'myproject.myapp',     )    
  • 16. 3.7. 使用 Admin Site ● 编辑项目根目录下的 urls.py ,去掉 admin 前的注 释符号 from django.conf.urls.defaults import *     # Uncomment the next two lines to enable the admin:     from django.contrib import admin     admin.autodiscover()     urlpatterns = patterns('',         # My App:         (r'^myapp/', include('myproject.myapp.urls')),         # Uncomment the next line for to enable the admin:         (r'^admin/(.*)', admin.site.root),       )  
  • 17. 3.7. 使用 Admin Site ● 使用命令 python manage.py syncdb ● 将自动创建 Admin Site 所需要的数据表,并可以 创建管理员帐号 ● 再次运行开发服务器 ● 访问 Admin Site http://servername:port/admin/  ● 可以创建 User 和 Group 并设置权限    
  • 18. 4. 定义 Model ● 4.1. 快速举例 ● Model 是关系型数据在应用程序中的映射 . 通常数据 库中的表和 Model 是相互对应的 . 表中的栏位表现为 Model 中的属性 ● 对于不需要存储在数据库表中的信息 ,  可以通过定义 一个叫作 Meta 的 Model 的内类 (Inner Class) 来实现 ● Django 提供了通过 Model 自动生成数据库表和字段 ,  并且访问操作数据的功能    
  • 19. 4.1. 快速举例 ● 编辑 myapp 目录下的 models.py 定义 Model from django.db import models class Entry(models.Model):         headline = models.CharField(max_length=255)         body_text = models.TextField()         pub_date = models.DateTimeField()    
  • 20. 4.2. 定义 Fields & Relations ● Django 有两方面对于字段命名的限制 ● 一个是不能使用 python 的保留字 ( 如 : pass) ● 另一个是字段的名字中不能存在两个或以上下划线 ( 即 : __ ),Django 使用双下划线作为默认的查询符号 ● 使用命令 python manage.py shell >>>from django.db import models >>>dir(models) ●  <New> 可使用 db_tablespace 选项代替 settings 中的   DEFAULT_INDEX_TABLESPACE,  如果数据库不支持则被忽略  
  • 21. 4.2. 定义 Fields & Relations ● 列举 fields: ● AutoField ● BooleanField ● CharField ● CommaSeparatedIntegerField ● DateField ● DateTimeField ● DecimalField <New> 固定精度十进制小数 可使用参数 max_digits 和 decimal_places    
  • 22. 4.2. 定义 Fields & Relations ● EmailField ● FileField <New> 使用 max_length 改变默认的 varchar(100) ● FilePathField <New> 使用 max_length 改变默认的 varchar(100) ● FloatField  <Change> 表现为 Python 中的 float ● IPAddressField ● ImageField <New> 使用 max_length 改变默认的 varchar(100) ● IntegerField ● NullBooleanField  ● PhoneNumberField  
  • 23. 4.2. 定义 Fields & Relations ● PositiveIntegerField ● PositiveSmallIntegerField ● SlugField ● SmallIntegerField ● TextField ● TimeField ● URLField ● USStateField  ● XMLField  
  • 24. 4.2. 定义 Fields & Relations ● 列举 relationships: ● OneToOneField       One­to­one relationships ● ForeignKey              Many­to­one relationships ● ManyToManyField  Many­to­many relationships ● <New> 在另外一个 app 中引用当前 Model 中的 类 ,  可以通过 applabel.classname 的方式 ,  如 :  auther = models.ForeignKey('auth.User')     
  • 25. 4.2. 定义 Fields & Relations ● <New> 使用额外的类建立 ManyToMany 关联 class Person(models.Model):         name = models.CharField(max_length=128)         def __unicode__(self):             return self.name class Group(models.Model):         name = models.CharField(max_length=128)         members = models.ManyToManyField(Person, through='Membership')         def __unicode__(self):             return self.name  class Membership(models.Model):         person = models.ForeignKey(Person)         group = models.ForeignKey(Group)         date_joined = models.DateField()           invite_reason = models.CharField(max_length=64)  
  • 26. 4.3.Model 继承 <New> ● 4.3.1. 抽象基类 (Abstract base classs) ● 使用抽象基类的方式实现类继承 ,  是用来提取一些 Model 中的公用的字段放在一个不需要建立数据表的 Model 中 ● 基类的字段会被建立在子类的数据表中 .  通过在基类 的内类 Meta 中声明 abstract=True 实现 class CommonInfo(models.Model):         name = models.CharField(max_length=100)         age = models.PositiveIntegerField()              class Meta:             abstract = True      class Student(CommonInfo):         home_group = models.CharField(max_length=5)    
  • 27. 4.3.2. 内类 Meta 继承 ● 当一个抽象基类被建立的时候 , Django 使你声明 的内类 Meta 作为抽象基类的一个可用的属性 ● 如果其子类没有声明自己的内类 Meta, 它将继承父类也就是抽象基类的内类 Meta    
  • 28. 4.3.2. 内类 Meta 继承 ● 如果你想扩展抽象基类中的内类 Meta,  可以在子 类中声明 Meta 继承抽象基类的内类 Meta class CommonInfo(models.Model):         ...         class Meta:             abstract = True             ordering = ['name']       class Student(CommonInfo):         ...         class Meta(CommonInfo.Meta):             db_table = 'student_info'    
  • 29. 4.3.2. 内类 Meta 继承 ● Django 对抽象基类中的内类 Meta 会做一个判断 : 在安装 Meta 作为属性之前 ,  先设置 abatract=False ● 这就意味着抽象基类的子类不会自己自动的成为 抽象基类 , 当然可以通过 abstract=True 让一个抽 象基类继承自另一个 ● 需要注意一些属性不应该在抽象基类的 Meta 中 被声明 ,  比如 db_table,  否则如果子类不声明自 己的内类 Meta, 将意味着它们将都使用相同的数 据库表 ,  这当然不是我们想要的 .    
  • 30. 4.3.2. 内类 Meta 继承 ● 需要注意在基类中使用 ForeignKey,ManyToManyField 时的 related_name 属性 ,  必须为它指定一个对于所有子类都唯一的 反向引用的名字 class Base(models.Model):         m2m = models.ManyToMany(OtherModel, related_name="%(class)s_related")             class Meta:             abstract = True       class ChildA(Base):         pass          class ChildB(Base):         pass    
  • 31. 4.3.2. 内类 Meta 继承 ● 如果没有在抽象基类中指定 related_name 属性 ,  它将会自动使用子类的名字接一个 '_set' ● 以上面的代码为例 ,  对于 m2m 字段的反向引用 的名字 ,  对于 ChildA 应该是 childa_set,  对于 ChildB 应该是 childb_set    
  • 32. 4.3.3. 多表继承( Multi-table inheritance) ●  Django 支持的第二种 Model 继承类型是继承体 系中的每一个 Model 都在数据库中建立自己的 表 ,  父类和子类通过一个自动建立的 OneToOneField 关联 class Place(models.Model):         name = models.CharField(max_length=50)         address = models.CharField(max_length=80)          class Restaurant(Place):         serves_hot_dogs = models.BooleanField()         serves_pizza = models.BooleanField()    
  • 33. 4.3.3. 多表继承( Multi-table inheritance) ● 如果一个 Place 同时也是一个 Restaurant,  虽然在 数据库中他们使用不同的表 ,  依然可以通过任意 一个 Model 使用语句对它进行查询 .   >>> r = Restaurant(name="Bob's Cafe")     >>> r.save()     >>> Restaurant.objects.filter(name="Bob's Cafe")     >>> p = Place.objects.filter(name="Bob's Cafe") ● 如果 p 同时也是 Restaurant,  那么你可以通过使用 类名的小写直接访问 >>> p.restaurant     <Restaurant: ...> ● 如果 p 不是 Restaurant,  引用 p.restaurant 系统将   会抛出一个 error  
  • 34. 4.3.4. 多表继承与 Meta 内类 ● 在多表继承的情形下 ,  子类的内类 Meta 继承自 父类的内类 Meta 是没有意义的 .  所有的 Meta 选 项已经被应用到父类 ● 再应用它们一次到子类 ,  通常情形下可能导致冲 突的情况 .  所以一个子类不能访问它的父类的内 类 Meta.  ● 但是也有一些情形下 ,  需要限制子类继承自父类 的行为属性 :  ● 如果子类没有指定一个 ordering 属性或者 get_latest_by 属性 , 它将从父类继承 .    
  • 35. 4.3.4. 多表继承与 Meta 内类 ● 如果父类有排序 ordering 的属性,而你不想子类 有任何的自然排序 ,  你可以明确的声明 ordering 为空 :     class ChildModel(ParentModel):         ...         class Meta:             # Remove parent's ordering effect             ordering = []    
  • 36. 4.3.5. 继承和反向关联 ● 因为多表继承使用一个隐含的 OneToOneField 连 接父类与子类 ,  像上面的例子一样 , 从父类向下 访问子类成为可能 ● 但是这将耗尽 ForeignKey 和 ManyToManyField 默认的 related_name 名字 .  如果你设置那些类型 的关系到另一个 Model 的子类 ● 你必须为每一个这样的字段指定 related_name 属 性 .  如果你忘记 , Django 将在你运行 manage.py  validate 或 manage.py syncdb 时抛出一个 error    
  • 37. 4.3.5. 继承和反向关联 ● 例如再一次使用类继承上面的 Place,  我们需要指 定另一个 ManyToManyField 的 related_name: class Supplier(Place):         # Must specify related_name on all relations.         customers = models.ManyToManyField(Restaurant, related_name='provider')    
  • 38. 4.3.6. 指定 parent_link 属性 ● Django 会自动建立 OneToOneField 来连接你的子 类到非抽象的父类的 Model,  如果你想要控制 反向连接到父类的名字 ● 你可以指定自己的连接字段并且传给它一个 parent_link=True 的参数 : class Supplier(Place):         parent = models.OneToOneField(Place, parent_link=True)    
  • 39. 4.3.7 多重继承 ● 就像 Python 的继承体系一样 ,  你可以让 Django 的子类 Model 继承自多个父类 Model, python 的 标准继承命名分解规则也适用这里 ● 首个出现特定属性名字的基类将是真正使用的那 一个 ,  一旦找到该名称就将停止继续搜索 .  这就 意味着如果多个父类都包括 Meta 内类 ,  只有第 一个的 Meta 内类将被使用 ,  其它的都将被忽略 .    
  • 40. 4.3.7 多重继承 ● 一般情况下 ,  你的子类都不需要从多个父类继 承 .  主要的用例是帮助实现 Mix­in 类 ,  增加一个 独特的额外字段或方法到每一个继承 Mix­in 的子 类 ● 如果你要避免不得不算出某个细节的信息是从哪 里而来的麻烦,请保持你的 Model 继承体系尽可 能的简单和直接 .    
  • 41. 4.4.Model 的 save/delete 编写 before/after 钩子 ● 需要重载 save 或 delete 方法 ,  加入自己需要的 before/after 代码 ,  并调用超类的 save 方法 class Person(models.Model):         first_name = models.CharField(max_length=20)         last_name = models.CharField(max_length=20)         def __unicode__(self):             return u"%s %s" % (self.first_name, self.last_name)         def save(self):             print "Before save"             super(Person, self).save() # Call the "real" save() method             print "After save"         def delete(self):             print "Before deletion"               super(Person, self).delete() # Call the "real" delete() method               print "After deletion"
  • 42. 5. 定义 Form ● Form 表单是字段 (Field) 的集合 , 能够验证数据 , 生 成模板所需要的 HTML ● Field 字段是一个负责做数据验证的类 ● Widget 协助字段生成 HTML ● Form Media 定义表单所需要的 CSS 和 Javascript 等资源    
  • 43. 5.2. 定义 Form ● Form 定义举例 from django import forms  class ContactForm(forms.Form):         subject = forms.CharField(max_length=100)         message = forms.CharField()         sender = forms.EmailField()         cc_myself = forms.BooleanField(required=False) ● Form 输入 HTML,  使用 as_p(),as_table(),as_li() >>>form.as_p    <form action="/contact/" method="POST">    <p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p>    <p><label for="id_message">Message:</label><input type="text" name="message" id="id_message" /></p>    <p><label for="id_sender">Sender:</label><input type="text" name="sender" id="id_sender" /></p>    <p><label for="id_cc_myself">Cc myself:</label><input type="checkbox" name="cc_myself"  id="id_cc_myself" /></p>    <input type="submit" value="Submit"></form>    
  • 44. 5.3. 使用 ModelForm ● 如果我们开发的是一个数据库驱动的应用 ,  我们 可能希望 Form 能够直接和 Model 绑定在一起 ,  那么就可以直接使用 ModelForm from django.forms import ModelForm class ArticleForm(ModelForm): class Meta: model = Article >>> article = Article.objects.get(pk=1) >>> form = ArticleForm(instance=article) >>> f.save()    
  • 45. 6. 开发 Views ● Django 提倡 Model Template View 的开发方式 ● Views 是编写的处理业务逻辑和表单提交的函数 ● ­ myproject |­ myapp     |­ __init__.py #  表明目录是一个 Python package     |­ models.py   #  模型定义文件,根据模型定义生成数据库结构 |­ views.py     #   视图方法定义 |­ forms.py     #   表单定义 |­ admin.py    #   定义 ModelAdmin     
  • 46. 6.2. 通用视图 Generic Views ● 帮助我们处理三类问题 ● 处理 list/detail ● 处理基于时间的归档页面 ,  如 blog 的时间归档 ● 处理 model 的 creating, editing, deleting  ● 举例 from django.views.generic.list_detail imort object_list, object_detail def entry_list(request): return object_list(request, Entry.objects.get_query_set(), paginate_by=10)     
  • 47. 7. 编写 Template ● 编辑项目目录下的 settings.py     TEMPLATE_DIRS = ( "/home/my_username/mytemplates", # Change this to your own directory.) ● 模板可以继承 {% extends "base.html" %} ● 复杂的代码编写自己的 templatetag from django import template register = template.Library() def paginator_number(cl,i):     if i =='.':  return u'... '     elif i == cl.page_num: return mark_safe(u'<span class="this­page">%d</span> ' % (i+1))     else:         return mark_safe(u'<a href="%s"%s>%d</a> ' % (cl.get_query_string({PAGE_VAR:  i}), (i == cl.paginator.num_pages­1 and ' class="end"' or ''), i+1)) paginator_number = register.simple_tag(paginator_number)    
  • 48. 对 Django 新功能的期待 ● Multi Data Source ORM 最希望 Django 能够支持多数据源的对象关系映 射,真正企业中的应用大多存在多个数据源