• Django MTV结构分析


    目录结构

    一个成熟的django项目的结构大致如下:

    /project/
    |-- project/
        |-- settings.py        # 项目配置
        |-- urls.py            # 项目路由定义
        |-- wsgi.py        # nginx/apache
    
    |-- app/
        |-- templates/
            |-- app/
                |-- base.html    # 模板
                ...
        |-- admin.py        # 配置模型models在django原生后台的管理
        |-- apps.py        # 应用级别的配置
        |-- forms.py        # 表单处理逻辑
        |-- managers.py    # 模型处理逻辑
        |-- models.py        # 模型定义
        |-- urls.py            # 路由设置
        |-- views.py        # 控制层
        |-- tests.py
        ...        
    |-- other-app/
        ...                     # 另一个应用
    |-- static/
        |-- app/
        |-- other-app/
        |-- admin/   

    django 以多个应用(app)耦合的形式来组合成一个大的web项目(project),多个app之间可以相互调用,如:

    from app1.models import SomeModel

    所有应用需要在 settings.INSTALLED_APPS 中注册。除此之外,可在 settings.py 中配置一些公共参数,例如数据库,时区,邮箱,静态文件目录等

    静态文件处理 static

    好像django的静态文件位置没有限制,为了方便管理统一在根目录下面,按应用名建立目录。这样在web服务器 apahce/nginx 可以方便配置路径别名(Alias)转交web服务器直接进行处理。
    同时在 settings.py 中设置 STATIC_URL = '/project/static/' 以在模板文件中通过{% static 'app/xxx.css' %}调用

    django 原生后台管理 admin.py

    django 自带admin 后台,通过 admin.py 很容易对简单的模型进行增删改查管理操作。
    在业务逻辑不是很复杂的情况下,简单配置一下就可以实现对数据的管理。

    django 路由控制 urls.py

    urlpatterns = [
        url(r'^$', views.IndexView.as_view(), name='home'),
        url(r'^more/$', views.delete, name='more'),
    ]

    代码示例中有view函数和View类的两种不同定义方式
    name参数定义在模板中解析的url变量名:{% url 'app:home' %}

    django 模型定义 models.py & managers.py

    个人认为学习理解 models 是掌握 django 的关键。跟以往php项目经验单独建立数据库不同,django 把数据库结构也包含到项目中。
    models的定义主要包括数据表结构的各个字段(Field),表与表之间的关系(ForeignKey),对表的查询操作(Manager)
    Field 和 Manger 都支持自定义
    django 会根据models中的定义自动建立数据表:

    # 定义模型
    vim models.py
    # 生成变更
    python manage.py makemigrations 
    # 执行变更
    python manage.py migrate

    managers.py 属于 models 的一部分,我觉得这一块可以从models中拿出来单独定义。
    它主要提供2个功能:

    • 修改默认的数据集 objects
      继承models.Manager 重写 get_queryset 方法,对默认的 queryset 进行预处理
      class DahlBookManager(models.Manager): def get_queryset(self): return super().get_queryset().filter(author='Roald Dahl')
    • 扩展默认的查询方法
      个人理解这里定义自己想要的各种复杂查询
      class PollManager(models.Manager): def with_counts(self): from django.db import connection with connection.cursor() as cursor: cursor.execute(""" SELECT p.id, p.question, p.poll_date, COUNT(*) FROM polls_opinionpoll p, polls_response r WHERE p.id = r.poll_id GROUP BY p.id, p.question, p.poll_date ORDER BY p.poll_date DESC""") result_list = [] for row in cursor.fetchall(): p = self.model(id=row[0], question=row[1], poll_date=row[2]) p.num_responses = row[3] result_list.append(p) return result_list

    django 逻辑控制 views.py & froms.py

    相当于MVC中的 Controller 控制层。定义为各种函数,从传入的 request 中获取请求参数,生成 response
    django 提供了很多封装函数如 render,get_object_or_404来方便处理。
    此外,还可以使用基本视图类处理请求,View,TemplateView,RedirectView
    forms 属于 views 的一部分,同样我觉得可以单独拿出来处理
    它主要负责 views 从 request 中获取参数并预处理这部分逻辑

    django 视图模板 templates

    模板选择在 views 中通过render制定, 或 继承的 TemplateView 中定义template_name
    template 文件支持继承,子模板通过重写 <% block %> 块来渲染不同页面:

    # base.html
    <div>Public block</div>
    {% block private %}{% endblock private %}
    # child.html
    {% extends 'base.html' %}
    {% block private %}
    <div >private block</div>
    {% endblock private %}

    转载至:https://www.cnblogs.com/dapianzi/p/8177797.html
  • 相关阅读:
    CSS美化自己的完美网页
    HTML基础做出属于自己的完美网页
    前端基础知识
    ajax应用篇
    mysql的介绍和安装
    MYSQL系列之(二)
    TP框架控制器的空操作
    Thinkphp框架基础
    PHP之Smarty模板引擎
    App 开发:Hybrid 架构下的 HTML5 应用加速方案
  • 原文地址:https://www.cnblogs.com/summerxye/p/11057835.html
Copyright © 2020-2023  润新知