zoukankan      html  css  js  c++  java
  • Django学习笔记3:Model,Template,View 基本概念

    总体结构

    Django是MTV结构,即:Model, Template, View

    • Model:定义数据的存储格式,并且提供了数据库访问的API。
    • View:定义那些数据被显示,是业务逻辑处理模块。
    • Template:定义数据如何被显示。

    Django工程包含工程的配置、及多个APP,每个APP完成相对独立的功能。在设计中,要尽量保持每个APP的独立性,以做到APP是即插即用。

    各个模块的交互关系

    Django收到HTTP请求后,依次完成下列处理:

    • 根据URL通过URLConf模块映射到View函数,将HttpRequest对象作为参数传入。
    • 在View函数中,获取HTTP请求的参数,通过Model访问数据库,进行业务逻辑运算得到输出数据。
    • 然后,加载Template,根据输出数据生成页面,将HttpResponse对象返回。

    Model

    一个类对应于数据库中的表(Table),类属性对应于表的字段(Field)。

    从 django.db.models.Model 派生,支持继承。

    要使用一个APP时,需要将该APP的Model添加到工程的 settings.py INSTALLED_APPS 中。

     

    Field的定义

    • 字段的类型:指定数据库表字段的类型,表单默认的Widget,以及校验条件。
    • 字段选项:null, blank, choices, default, unique, primary_key。
    • 表之间的关系:one-to-one, many-to-many, many-to-one。

    Model中可以定义Method,实现下列功能:

    • 添加定制的 "row-level" 功能;
    • override predefined methods;
    • 定义Model的Business Logic;
    • 定义Raw SQL;

    数据库表查询

    使用QuerySet对象实现多种方式的查询,Model的objects属性返回QuerySet对象。

    1)基本查询

    • all_entries = Entry.objects.all()
    • part_entries = Entry.objects.all()[:5]
    • one_entry = Entry.objects.get(pk=1)

    2)使用过滤器查询

    • Entry.objects.filter(pub_date__year=2006)
    • Entry.objects.exclude(pub_date__gte=datetime.now())

    3)字段(Field)查询

    • 该功能等价于SQL中的WHERE,可以对Field指定更细致的查询条件。
    • 通过Keyword参数,传递给QuerySet对象的get, filter, exclude方法。格式:field__lookuptype=value 。
    • 常用的lookuptype有:
      • exact
      • iexact
      • contains
      • startswith, endswith

    Entry.objects.get(headline__exact="Man bites dog")

    Entry.objects.get(headline__contains='Lennon')

    QuerySet的特点

    • 多个过滤器可以组成链使用;
    • 每次查询返回的QuerySet对象是独立保存;
    • 使用了缓存机制;
    • 使用了延迟执行机制;

    View

    View代表一种应用, 返回被请求的页面。 View要实现两个功能:URL的分发处理,定义View函数。

     

    URL分发处理

    使用正则表达式定义 URL pattern,建立到View函数的映射关系。 

     

    环境配置

    • settings.ROOT_URLCONF:定义URL的配置文件位置;
    • settings.urlpatterns:定义URL patterns 到View函数的映射关系;

    URLpattern 匹配的范围:

    • 不包含domain
    • 不包含GET, POST参数
    • 匹配后的参数作为字符串传入view function

    从匹配结果到函数参数

    • 传送给View函数的第一个参数是HttpRequest对象,正则表达式匹配的内容作为第二个参数传入。
    • 可以使用Named groups,将匹配的部分作为keyword参数。
    • 格式:(?P<name>pattern)

    避免重复定义的机制

    • view prefix:提取view function的公共前缀
    • Including other URLconf

    View函数

    接收Web请求,返回Web响应,基本的处理流程是

    1. 收到传入的HttpRequest参数;
    2. 从HttpRequest中获得输入数据;
    3. 进行数据处理,构造Context数据;
    4. 加载Template;
    5. 使用Context数据Render Template;
    6. 返回 HttpResponse;

    相关的类

    • class HttpRequest:通过POST或GET属性访问传入的参数
    • class HttpResponse:主要派生类有 class HttpResponseRedirect,class HttpResponseNotFound
    • class UploadedFile
    • class QueryDict:multiple values for the same key

    快捷函数

    • render
    • render_to_response
    • redirect
    • get_object_or_404
    • get_list_or_404

    Template

    Template用于描述数据的表现,不包含业务逻辑处理。Django不是简单的将Python语言嵌入到HTML代码中,而是定义了一套标记,用于实现对HTML中数据的控制。通过变量访问数据,通过TAG控制Template的处理逻辑。

    变量

    • 格式:{{ variable }}

    TAG

    • 格式: {% tag %}
    • 常用的有:for/if/block and extends

    过滤器功能

    • 格式:{{ name|lower }}
    • 例:{{ value|default:"nothing" }}
    • 常用内置的过滤器:default, length, striptags 

    Template继承

    • 使用block/extend实现。
    • 在父模板中,使用block定义扩展点。
    • 在派生模板中,使用extend对扩展点进行重新定义。也可以引用父模板中的定义,使用{{ block.super }} 。

    -----------------------------

    2012.10.16 by Weichsel

  • 相关阅读:
    Android开源库
    银行卡的数字检測
    hdu4941 Magical Forest
    android之检測是否有网络
    在Oracle数据库中使用NFS,怎样调优?
    centos+nginx+php-fpm+php include fastcgi_params php页面能訪问但空白,被fastcgi_params与fastcgi.conf害慘了
    漫谈反射
    Android 四大组件学习之BroadcastReceiver二
    【LeetCode】two num 利用comparable接口 对对象进行排序
    扩展功能==继承?
  • 原文地址:https://www.cnblogs.com/weichsel/p/2725554.html
Copyright © 2011-2022 走看看