Django基础之MTV模型

一、Django基础

一、Django简介

  Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型(Model)、视图(View)和控制器(Controller)。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。

  1、mvc简介

  http://blog.csdn.net/pi9nc/article/details/18822325

  • Model:封装领域数据及逻辑。用于管理应用程序域的行为和数据,并响应为获取其状态信息(通常来自视图)而发出的请求,还会响应更改状态的指令(通常来自控制器)。
  • View:查询领域数据并展现给用户。用于管理信息的显示。
  • Conctroller:截获用户请求并改变领域数据。用于解释用户的鼠标和键盘输入,以通知模型和/或视图进行相应的更改。

  

  2、MTV模式简介

  Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下:

  模型(Model),即数据存取层

  处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

  模板(Template),即表现层

  处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

  视图(View),即业务逻辑层

  存取模型及调取恰当模板的相关逻辑。模型与模板之间的桥梁。

此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

  3、MTV模型的基本结构

│  db.sqlite3 ----------sqlie3数据库
│  manage.py
│
├─logres
│  │  admin.py          后台,可以用很少量的代码就拥有一个强大的后台。
│  │  apps.py
│  │  models.py         与数据库操作相关,存入或读取数据时用到这个
│  │  tests.py
│  │  urls.py
│  │  views.py
│  │  处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示
│  │      内容比如登陆后的用户名,用户请求的数据,输出到网页。
│  │  __init__.py
│  │
│  ├─migrations
│     │  0001_initial.py
│     │  __init__.py
│
│
│
│
├─Mushishi
│  │  settings.py  Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等
│  │  urls.py    urls.py
│  │             网址入口,关联到对应的views.py中的一个函数(或者generic类),
│  │             访问网址就对应一个函数。
│  │  wsgi.py    wsgi有多重一种uwsgi和wsgi,你用那种wsgi来运行Django,
                 一般不用改只有你用到的时候在改
│  │  __init__.py
│
│
├─static
└─templates         templates中的Html模板,
        index.html
        login.html
        regist.html

二、安装Django

1.window 使用pycharm安装
    过程略
2.window上使用pip安装
    pip install django               ##安装最新版本
    pip install django==1.11         ##安装指定的版本
3.linux下使用pip安装
    yum install python-pip
    pip install django               ##安装最新版本
    pip install django==1.11         ##安装指定的版本
4.检查是否安装成功
>>> import django
>>> django.VERSION

三、Django基本命令

  1、创建django命令

django-admin.py startproject project-name(你工程的名字)

  当前目录下会生成mysite的工程,目录结构如下

   

  1. manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
  2. settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
  3. urls.py ----- 负责把URL模式映射到应用程序。

  2、创建django的app

python manage.py startapp app-name(你app的名字)
或 django-admin.py startapp app-name(你app的名字)

  

  3、调试模式,启动项目

python manage.py runserver 8080#监听所有可用 ip (电脑可能有一个或多个内网ip,一个或多个外网ip,即有多个ip地址)python manage.py runserver 0.0.0.0:8000

  这样我们的django就启动起来了!当我们访问:http://127.0.0.1:8080/时就可以看到:

  4、同步数据库

python manage.py syncdb
注意:Django 1.7.1及以上的版本需要用以下命令
python manage.py makemigrations
python manage.py migrate

  这种方法可以创建表,当你在models.py中新增了类时,运行它就可以自动在数据库中创建表了,不用手动创建。

  5、清除数据库

python manage.py flush

  此命令会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表。

  6、创建超级管理员

python manage.py createsuperuser
# 按照提示输入用户名和对应的密码就好了邮箱可以留空,用户名和密码必填
按照提示就ok

修改管理员密码
python manage.py changepassword username(你当时设定的用户名)

  7、导入和导出数据

python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json

  8、Django项目终端

python manage.py shell

  这个命令和 直接运行 python 进入 shell 的区别是:你可以在这个 shell 里面调用当前项目的 models.py 中的 API,对于操作数据的测试非常方便。

  9、Django项目环境终端

python manage.py dbshell

  Django 会自动进入在settings.py中设置的数据库,如果是 MySQL 或 postgreSQL,会要求输入数据库用户密码。

在这个终端可以执行数据库的SQL语句。如果您对SQL比较熟悉,可能喜欢这种方式。

  10、查看帮助信息

python manage.py

  查看所有的命令,忘记子名称的时候特别有用。

  11、静态文件配置

概述:
     静态文件交由Web服务器处理,Django本身不处理静态文件。简单的处理逻辑如下(以nginx为例):

              URI请求-----> 按照Web服务器里面的配置规则先处理,以nginx为例,主要求配置在nginx.
                             conf里的location

                         |---------->如果是静态文件,则由nginx直接处理

                         |---------->如果不是则交由Django处理,Django根据urls.py里面的规则进行匹配

    以上是部署到Web服务器后的处理方式,为了便于开发,Django提供了在开发环境的对静态文件的处理机制,方法是这样:

  static配置:

STATIC主要指的是如css,js,images这样文件:

STATIC_URL = ‘/static/‘      # 别名
STATICFILES_DIRS = (
            os.path.join(BASE_DIR,"static"),  #实际名 ,即实际文件夹的名字
        )

注意点1:
 django对引用名和实际名进行映射,引用时,只能按照引用名来,不能按实际名去找
        <script src="/statics/jquery-3.1.1.js"></script>
        ------error-----不能直接用,必须用STATIC_URL = ‘/static/‘:
        <script src="/static/jquery-3.1.1.js"></script>

注意点2:
 STATICFILES_DIRS = (
    ("app01",os.path.join(BASE_DIR, "app01/statics")),
        )

 <script src="/static/app01/jquery.js"></script>

  media配置:

# in settings:

MEDIA_URL="/media/"
MEDIA_ROOT=os.path.join(BASE_DIR,"app01","media","upload")

# in urls:
from django.views.static import serve
url(r‘^media/(?P<path>.*)$‘, serve, {‘document_root‘: settings.MEDIA_ROOT}),

  访问测试:http://127.0.0.1:8080/media/1.png

‘‘‘
        静态文件的处理又包括STATIC和MEDIA两类,这往往容易混淆,在Django里面是这样定义的:

        MEDIA:指用户上传的文件,比如在Model里面的FileFIeld,ImageField上传的文件。如果你定义

        MEDIA_ROOT=c:\temp\media,那么File=models.FileField(upload_to="abc/")#,上传的文件就会被保存到c:\temp\media\abc

        eg:
            class blog(models.Model):
                   Title=models.charField(max_length=64)
                   Photo=models.ImageField(upload_to="photo")
          上传的图片就上传到c:\temp\media\photo,而在模板中要显示该文件,则在这样写
          在settings里面设置的MEDIA_ROOT必须是本地路径的绝对路径,一般是这样写:
                 BASE_DIR= os.path.abspath(os.path.dirname(__file__))
                 MEDIA_ROOT=os.path.join(BASE_DIR,‘media/‘).replace(‘\\‘,‘/‘)

        MEDIA_URL是指从浏览器访问时的地址前缀,举个例子:
            MEDIA_ROOT=c:\temp\media\photo
            MEDIA_URL="/data/"
        在开发阶段,media的处理由django处理:

           访问http://localhost/data/abc/a.png就是访问c:\temp\media\photo\abc\a.png

           在模板里面这样写<img src="/media/abc/a.png">

           在部署阶段最大的不同在于你必须让web服务器来处理media文件,因此你必须在web服务器中配置,
           以便能让web服务器能访问media文件
           以nginx为例,可以在nginx.conf里面这样:

                 location ~/media/{
                       root/temp/
                       break;
                    }

           具体可以参考如何在nginx部署django的资料。

           ‘‘‘

二、Django项目实战

  注:此环境在window环境下使用pycharm进行的

一、创建一个project工程和app

  1、pycharm创建项目

  

  2、project和APP概念

  Project是一个大的工程,

  下面有很多功能:(一个Project有多个App,其实他就是对你大的工程的一个分类)

  例如一个运维平台是一个工程,那么他的app就是CMDB,监控系统,OA系统,

  3、生成数据库 创建超级管理员用户

  注:此步骤是在pycharm的终端里使用命令实现的

1.同步数据库
python manage.py makemigrations
python manage.py migrate
本人使用的是django1.9.5版本
2.创建超级管理员
python manage.py createsuperuser
3.运行django
python manage.py runserver 8000

  浏览器访问: http://127.0.0.1:8000/admin/

  3、路由

  首先在helloword文件夹下(不是app目录,千万别写错)的urls.py填写路由规则

from django.conf.urls import url
from django.contrib import admin
#导入app下的view函数
from helloapp import  views
urlpatterns = [
url(r‘^admin/‘, admin.site.urls),
#当用户访问http://127.0.0.1:端口号的时候之间交给helloapp下面的views里的index函数来处理
url(r‘^$‘, views.index),
]

  4、views函数

  在helloapp(app)下面的views里写一个index函数

#Django 在返回的时候需要一层封装,需要导入HttpResponse
from django.shortcuts import render,HttpResponse

# Create your views here.
def index(request):
     #使用HttpRespons 封装返回信息
    return HttpResponse(‘<h1>hello world!!!</h1>‘)

  django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

  如果要返回html页面

在templates里创建index.html页面
内容:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello world!!</h1>
</body>
</html>
2.修改helloapp里的views.py的index函数

from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
# return HttpResponse(‘<h1>hello world!!!</h1>‘)
return  render(request,‘index.html‘)
#找到index.html
#读取index.html返回给用户

  python manage.py runserver 8000

  使用浏览器访问:http://127.0.0.1:8000

二、Django路由系统

  在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规则如下:

  每一个urls对应一个views里的函数

  1、基本的urls对应

urlpatterns = [
url(r‘^login/$‘, views.login),
url(r‘^index/$‘, views.index),
url(r‘^$‘, views.login),
]

  2、基于app的路由

  根据app对路由规则进行一次分类

  当app的urls很多的时候,那么就不能再工程的urls下面去设置,应该这样设置:

    1、首先在helloword下面的urls这样设置
#导入include
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from helloapp import  views
urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    #使用helloapp的urls规则
    url(r‘^helloapp/‘,include(‘helloapp/urls‘))

]
    2、在helloapp下面创建一个urls.py
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^login/‘,views.login),
    url(r‘^index/‘,views.index),
    url(r‘^reg/‘,views.reg),
    url(r‘^layout/‘,views.layout),
]
    3、在helloapp下面的views里创建上面urls对应的函数
from django.shortcuts import render,HttpResponse
# Create your views here.
def index(request):
    # return HttpResponse(‘<h1>hello world!!!</h1 >‘)
    return  render(request,‘index.html‘)
def login(request):
    return HttpResponse(‘login‘)
def reg(request):
    return HttpResponse(‘reg‘)
def layout(request):
    return HttpResponse(‘layout‘)
    4、访问测试
http://127.0.0.1:8000/helloapp/admin/ admin后台管理
http://127.0.0.1:8000/helloapp/layout/
http://127.0.0.1:8000/helloapp/login/
http://127.0.0.1:8000/helloapp/reg/
http://127.0.0.1:8000/helloapp/index/

  3、动态路由(传一个参数)

  比如分页:当urls大量过多的时候比如几百个的时候,那么肯定不会去写几百个路由规则
  所有这个时候就需要动态urls,使用正则表达式来完成

    1、在helloapp下面的urls写入以下内容:
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^book/(\d+)$‘, views.book), //正则匹配
]
    2、在helloapp下面的views写入以下内容:
from django.shortcuts import render,HttpResponse
# Create your views here.
def book(request,num):
    print(num)
    return HttpResponse(num)
当用户访问http://127.0.0.1:8000/helloapp/book/数字的时候
django会在自动把参数传给views里的book函数
    3、测试访问:
http://127.0.0.1:8000/helloapp/book/2

显示2

http://127.0.0.1:8000/helloapp/book/1

显示1

  4、动态路由(传多个参数)

  多个参数它是已/来分割的

  来一个url的加法

    1、在helloapp下面的urls写入以下内容:
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^book/(\d+)/(\d+)$‘, views.book),
]
    2、在helloapp下面的views写入以下内容:
def book(request,num1,num2):
    print(num1,num2)
    num = int(num1) + int(num2)
    return HttpResponse(num)
    3、测试访问:
http://127.0.0.1:8000/helloapp/book/2/1
显示3
http://127.0.0.1:8000/helloapp/book/2/10
显示12

  他的顺序是:正序的,你先给他传那个值,第一个参数就是那个

  5、动态的路由(Key:value的形式)

    1、在helloapp下面的urls写入以下内容:
from django.conf.urls import url,include
from django.contrib import admin
#导入app下的view函数
from . import views
urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^book/(?P<k1>\d+)/(?P<k2>\d+)$‘, views.book),
    这里?p<v1>这里的v1就是key,vlaue就是传进去的值,
]
    2、在helloapp下面的views写入以下内容:
from django.shortcuts import render,HttpResponse
# Create your views here.
def book(request,k1,k2):
    print(k1,k2)
    return HttpResponse(k1+k2)

  这样我们就不必按照顺序去取了,可以通过key,value的方式来取传进来的值

  注:可以根据传来的值来进行判断返回给用户指定的url,过程略。

  6、基于反射的动态路由

仅仅是通过反射来实现的,通过文件找到里面的函数然后执行!
但是在Django中不建议使用此方法。因为不同的WEB框架建议你使用不同的方式,
Django就不建议使用反射

原文地址:https://www.cnblogs.com/happy-king/p/8254530.html

时间: 2024-11-16 06:11:45

Django基础之MTV模型的相关文章

django基础知识之模型查询:

查询集表示从数据库中获取的对象集合 查询集可以含有零个.一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主要讨论如下知识点 查询集 字段查询:比较运算符,F对象,Q对象 查询集 在管理器上调用过滤器方法会返回查询集 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤 惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库 何时对查询集求值:迭代,序列化,与if合用 返回查询

Django学习【第1篇】:Django之MTV模型

Django框架第一篇基础 一个小问题: 什么是根目录:就是没有路径,只有域名..url(r'^$') 补充一张关于wsgiref模块的图片 一.MTV模型 Django的MTV分别代表: Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量(数据库的内容)如何巧妙的嵌入到html页面中 View(视图):负责业务逻辑,并在适当的时候调用Model和Template 此外,Django还有一个URL分发

web框架---Django之MTV模型

MTV模型 Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当的时候调用Model和Template 此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

Django基础核心技术之Model模型的介绍与设计

Django基础核心技术之Model模型的介绍与设计原创: Yunbo Shi Python Web与Django开发 2018-05-03Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL的配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用.今天小编我就拼了老命来用千字长文给你来介绍下第一项Django核心基础知识之Model的设计吧.想持续了解后续Django Web开发技术请订阅我的公众号[Python与Django大咖之路].

Django基础之模型(models)层

目录 Django基础之模型(models)层 一 ORM简介 二.单表查询 Queryset队像和mployee对象 神奇的双下划线的模糊查询 聚合查询 分组查询 F与Q查询 F查询: Q查询 Q查询进阶 查询优化(面试) only与defer select_related与prefetch_related Django ORM中的事务操作 补充知识: Django基础之模型(models)层 Django测试环境搭建:拷贝manage.py中的行代码放到tests.py文件中导入模块 imp

Python学习之旅—Django基础

前言  前段时间业务比较繁忙,没时间更新博客,从这周开始将继续为各位更新博客.本次分享的主题是Django的基础部分,涵盖Django MTV三部分,并通过一个简单的班级管理系统来说明如何使用Django进行开发,好啦,开始今天的主题吧! 一.浅谈MVC.MTV和MVVM 要学习Django,我们很有必要了解下MVC,MTV和MVVM三种模式. [001]MVC MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式(本文不讨论桌面应用的MVC),它把业务

Python之路-(js正则表达式、前端页面的模板套用、Django基础)

js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 登录注册验证: test: 判断字符串是否符合规定的规则 rep = /\d+/;   (定义规则) rep.test('')   (引号里面必须包含字母和数字才返回true,否则为false) rep = /^\d+$/; (只有是纯数字时候才返回true,否则是false) exe

django中的Model模型一:

在django的框架设计中采用了mtv模型,即Model,template,viewer Model相对于传统的三层或者mvc框架来说就相当对数据处理层,它主要负责与数据的交互,在使用django框架设计应用系统时,需要注意的是django默认采用的是orm框架中的codefirst模型,也就是说开发人员只需要专注于代码的编写,而不需要过多的关注数据库层面的东西,把开发人员从数据库中解放出来 django会根据Model类生成一个数据库镜像文件,然后再使用该镜像文件生成数据库,同时该文件将记录与

Django[基础知识]

Python功能最全的WEB框架:Django,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 使用Django需进行以下操作: 1.创建Django项目,创建方式有两种. a.命令操作: django-admin startproject  dg_web   //dg_web为项目名称 b.直接在开发环境IDE下进行新建django项目 创建项目之后的文件目录如下: 2.在创建的项目下建立功能程序,操作如下: 命令行:python manage.py startap