Django基本流程

一、Django简介

Django是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网站!

初次发布于2005年7月,并于2008年发布了第一个正式版本1.0。

二、Django特点

强大的数据库功能: 拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生SQL。

自带强大的后台: 几行简单的代码就让你的网站拥有一个强大的后台,轻松管理内容!

优雅的网址: 用正则匹配网址,传递到对应函数,随意定义,如你所想!

模板系统: 强大,易扩展的模板系统,设计简易,代码,样式分开设计,更容易管理。

(注:前后端分离时,也可以用Django开发API,完全不用模板系统。)

缓存系统,与Memcached, Redis等缓存系统联用,更出色的表现,更快的加载速度。

国际化,完全支持多语言应用,允许你定义翻译的字符,轻松翻译成不同国家的语言。

三、MVC模式

MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件中,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

MVC

- Model(模型)

    应用程序中用于处理应用程序数据逻辑部分;

    通常模型对象负责在数据库中存取数据;

- View(视图)

    应用程序中处理数据显示部分;

    通常视图是依据模型数据创建的;

- Controller(控制器)

    应用程序中处理用户交互部分;

    通常控制器负责从视图中读取数据,控制用户输入,并向模型发送数据;

优点: 降低各个功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用。

四、MTV模式

本质上MTV与MVC模式没有什么区别,也是各组件之间为了保持松耦合关系,只是定义上有些不同。

MTV


- View(视图)

    负责业务逻辑,并在适当的时候调用Model和Template

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

五、Django环境搭建

Django版本选择


pip安装(如果有直接跳过)

- 下载get-pip.py文件(Linux, Mac OSX, Windows都可用)https://bootstrap.pypa.io/get-pip.py- 安装(在终端中运行)    $ python get-pip.py备注:    当Python2.x和Python3.x共存的时候要区分是哪个版本需要安装;

pip更新(Linux或MacOS): pip install -U pip

pip更新(Windows): python -m pip install -U pip

安装Django

- 安装    $ pip install Django==1.11.4- 验证是否成功()   

进入到python环境(终端中输入python)

>>> import django

>>> django.get_version()'1.11.4'

六、Django项目创建

新建Django项目:   

$ django-admin startproject projectName目录层级说明:   

manage.py 一个命令行工具,可以使我们多种方式对Django项目进行交互    projectName/__init__.py 一个空文件,告诉python这个目录被看做一个python包(有这个能称之为包)   

projectName/settings.py 项目的配置文件   

projectName/urls.py  项目URL声明   

projectName/wsgi.py    项目与WSGI兼容的Web服务器入口

备注: Linux或Mac下,直接在终端中操作;而在Windows中在cmd中操作(开始 -> 搜索cmd)

七、设计表结构

班级表

表名: grades字段: 序号id、班级名gname、开班时间gdate、男生数量gboynum、女生数量ggirlnum、是否删除isdel

学生表

表名: students字段: 序号id、学生名sname、性别ssex、年龄sage、班级sclass、简介sbrief、是否删除isdel

八、配置数据库

在__init__中添加两行代码 (确保安装mysql,另外需要pip3 install pymysql)

importpymysqlpymysql.install_as_MySQLdb()

python3安装的是PxMysql (和python2是不一样的)

在settings.py中修改默认数据库

DATABASES = {'default': {

# 修改为


mysql'ENGINE':'django.db.backends.mysql',

# 必须先创建有对应的数据库

'NAME':'zyz',

# 用户名

'USER':'root',

# 密码

'PASSWORD':'123456’,

        # 主机

        'HOST': '127.0.0.1',

        # 端口号

        'POST': '3306’    }}

Django默认使用SQLine数据库

九、创建应用

要先进入项目目录下,cd projectName然后执行下面的命令:

$ python3 manage.py startapp appName

项目文件说明:

    admin.py 站点配置

    models.py 模型

    views.py 视图

其实一个项目中可以创建多个应用;

十、激活应用

在settings.py文件中,将appName应用加入到INSTALL_APPS选项中.

INSTALLED_APPS = ['django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'appName'# 添加自己的应用]

十一、定义模型

班级表

# 班级表

GradesclassGrades(models.Model)

:# 对应字段,以及字段类型

# id          = models.IntegerField()

gname      = models.CharField(max_length=30)   

gdate      = models.DateField()   

gboynum    = models.IntegerField()   

ggirlnum    = models.IntegerField()   

isdel      = models.BooleanField(default=False)

需要引入from django.db import models。模型类要继承models.Model类。

学生表

# 学生表

StudentsclassStudents(models.Model):

# 自定义模型管理器

studentObj1 = models.Manager()   

studentObj2 = StudentsManager()

# 在没有添加主键时,它会在生成时自动添加主键

# id          = models.IntegerField()

sname      = models.CharField(max_length=30)   

ssex        = models.CharField(max_length=10)   

sage        = models.IntegerField()   

sbrief      = models.CharField(max_length=50)  

isdel      = models.BooleanField(default=False)

# 关联外键(学生都会有一个班级)

sclass = models.ForeignKey('Grades')

十二、数据库中生成对应表单

生成迁移文件

$ python3 manage.py makemigrations

备注: 在migrations目录中生成一个迁移文件,此时数据库中还没生成表单

执行迁移

$ python3 manage.py migrate

备注: 相当于执行了MySQL语句创建了表单(appname_students、appname_grades)

十三、测试数据库表单操作

- 进入到Python shell   

$ python3 manage.py shell   

- 引入包   

from myapp.models import Grades,Students  

from django.utils import timezone   

from datetime import *

- 查询所有数据  

Grades.objects.all()   

备注: 在模型类中,其实会有一个隐藏属性objects-

添加数据(创建对象)

>>> grade = Grades()

>>> grade.gname ='python04'

>>> grade.gdate = datetime(year=2018,month=5,day=27)

>>> grade.gboynum =30>>> grade.ggirlnum =20

>>> grade.save()

# 只有执行保存,才会往数据库中插入数据备注: 添加数据本质,就是创建一个模型类的对象实例- 查看数据(查看对象)   

Grades.objects.get(pk=1)   

Grades.objects.get(pk=2)

- 修改数据(修改对象属性)   

g = Grades.objects.get(pk=1)   

g.gboynum =70g.save()   

- 删除数据   

g.delete()

# 物理删除,即数据库中表单数据被删除

- 关联对象

# 获取到班级对象 (pk即是id那个字段)

>>> grade = Grades.objects.get(pk=2)

# 添加学生对象

>>> stu1 = Students()

>>> stu1.sname ='王大帅'

>>> stu1.ssex ='男'

>>> stu1.sage =18

>>> stu1.sbrief ='我住隔壁,我姓王,你有事情我帮忙'

>>> stu1.sclass = grade

# 这个即是关联上对象,如果没有管理,执行save会报错

>>> stu.save()

>>> stu2 = Students()

>>> stu2.sname ='李花花'

>>> stu2.ssex ='女'

>>> stu2.sage =18

>>> stu2.sbrief ='你负责赚钱养家,我负责貌美如花.'

>>> stu2.sclass = grade

>>> stu2.save()   

- 获取关联对象    语法:        对象.关联的类名小写_set.all()  

例如:          grade.students_set.all()  

备注: 在班级中,想要获取某个班级中关联的学生信息    需求: python04班级存在,  如何快速关联上快速创建对应学生?

# 可以直接通过以下方法创建,并且不需要调用保存 (但班级是python04而不是python05)

# 其实就是直接grade和创建的学生对象关联起来了

stu3 = grade.students_set.create(sname='王八',ssex='男',sage=20,sbrief='哈哈,咬我啊..')

十四、启动服务器

语法:python3manage.pyrunserverip:port

例如:python3manage.pyrunserver

备注:IP可以不写,代表即是本机IP端口号默认是8000   

启动成功后,在浏览器可以看到”Itworked!”

说明:    这是一个纯python写的轻量级web服务器,仅仅在开发测试阶段中使用

十五、Admin站点管理(后台可视化界面操作)

概述

内容发布: 负责添加、修改、删除内容

公告访问

配置Admin应用

在`settings.py`文件中的IINSTALLED_APPS中添加'django.contrib.admin'(默认是已经是添加好的)

创建管理员用户

$ python3 manage.py createsuperuser

访问站点管理

语法: ip:端口号/admin

例如: 192.168.0.13:8000/admin

站点管理的汉化版

在settings.py中替换以下内容即可    LANGUAGE_CODE ='en-us'替换 LANGUAGE_CODE ='zh-Hans'TIME_ZONE ='UTC'替换 TIME_ZONE ='Asia/Shanghai'

管理数据表(后台界面中)

修改admin.py文件:  

# 引入

from.modelsimportGrades,Students

# 注册

admin.site.register(Grades)admin.site.register(Students)

自定义管理数据页面(因为原本页面显示不够友好)

# 自定义管理数据页面

# 该类需要注册时添加进去

classGradesAmin(admin.ModelAdmin):

# 列表页的属性

# 显示字段(需要显示什么字段,就写上什么字段即可)

list_display = ['pk','gname','gdate','gboynum','ggirlnum','isdel']

# 过滤器(过滤字段)

list_filter = ['gname']

# 搜索字段

search_fields = ['pk']# 分页(多少条为一页)list_per_page =5

# 添加、修改页属性# 属性的先后顺序

fields = ['gboynum','gname','gdate','ggirlnum','isdel']

# 给属性分组(fields和fieldsets不能同时使用)

fieldsets = [              

('num',{'fields':['gboynum','ggirlnum']}),               

('base',{'fields':['gname','gdate','isdel']}),   

]

# 注册(以后其实不会在这里完成注册,会通过装饰器完成注册!)

admin.site.register(Grades,GradesAmin)

自定义管理页面(关联对象)

需求: 在创建班级时,可以直接添加几个学生

# TabularInline 或 StackedInline 两种显示方式

classStudentsInfo(admin.TabularInline):

# 要创建学生

model = Students

# 需要创建几个

extra =1

# 与Grades关联上

classGradesAmin(admin.ModelAdmin):

# 与上面关联上inlines = [StudentsInfo]

自定义管理页面(布尔类型的显示问题)

classStudentsAdmin(admin.ModelAdmin):

defisdel(self):ifself.isdel ==False:return"删除"

# 设置页面列的名称

isdel.short_description ='是否删除'

自定义管理页面(执行动作的位置)

# 将动作位置放置底部

classStudentsAdmin(admin.ModelAdmin):

# 执行动作的位置

actions_on_bottom =Trueactions_on_top =False

十六、使用装饰器完成注册

# 自定义管理数据页面@admin.register(Students)classStudentsAdmin(admin.ModelAdmin):

十七、视图基本使用

概述

在Django中,视图对web请求进行回应;视图其实就是一个python函数,在views.py文件中定义;

备注: 有几个页面就有几个视图

定义视图

fromd  jango.http   import   HttpResponse

# 没有使用任何的模板

def  index(request):

return    HttpResponse('hello zyz!!!')

配置url (简单)

# 修改project/urls.py文件

from  django.conf.urls   import   url,include

from  django.contrib   import   admin

urlpatterns = [    url(r'^admin/', admin.site.urls),   

url(r'^', include('myapp.urls')),# 会定位到myapp.urls中]

# 在对应应用中appname中,创建urls.py文件(与上面文件类似)

from  django.conf.urls  import url

from . import views

# 导入视图

 urlpatterns = [    url(r'^$', views.index)# 匹配到的就是views中的首页]

配置url (带参数)

# 描述(在views.py中定义的视图)

def   detail(request,num):

return   HttpResponse('detail-%s'% num)

# 在appname/urls.py中配置即可   

urlpatterns = [    url(r'^$', views.index),

# 添加括号,其实就是正则表达式中的组的概念。

# 而匹配到的就是可以给到

detail(request,num)函数中的


numurl(r'^(\d+)/$', views.detail)]

十八、模板的基本使用

概念

模板是HTML页面,可以根据视图中传递过来的数据进行填充

创建模板目录

在project中创建模板目录templates;

在templares目录中,创建对应应用目录appname作为项目模板目录;

创建对应应用app的目录,因为一个项目可以创建多个app,这也方便对应

配置模板路径

# 修改settings.py文件中的TEMPLATES;

TEMPLATES = [{'BACKEND':'django.template.backends.django.DjangoTemplates',

# 添加模板目录# 开头部分都有定义BASE_DIR,即项目其实目录'DIRS': [os.path.join(BASE_DIR,'templates')],'APP_DIRS':True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',        ],    },},]

模板语法

{{输出值,变量或对象属性}}

{%执行代码段%}

需求1

# 在网址中输入127.0.0.1/grades时,将所有班级显示出来# 在网址中输入127.0.0.1/students时,将所有学生显示出来- 先创建一个模板(project/templates/appname/)    grades.html    students.html- 模板代码(基本页面显示)- 创建对应视图

# 班级页defgrades(request):pass- url控制器(在myapp/urls.py中分发)    url(r'^grades/$', views.grades),- 视图中的具体操作

# 班级页

from.modelsimportGradesdefgrades(request):

# 通过模型取出数据库中对应表单数据

gradeList = Grades.objects.all()

# 将数据传递给模板(模板将数据渲染上之后再返回)

returnrender(request,'myapp/grades.html',{'grades': gradeList})

需求2

# 在班级信息中点击时,显示对应班级信息- 每个班级点击时,URL都会有变化 

  {{grade.gname}}- 匹配不同的视图  

url(r'^grades/(\d+)$', views.gradeStudents),

# 班级对应学生页- 视图中的具体操作

# 对应班级的学生信息

def gradeStudents(request,gradeid):

# 获取对应班级对象

grade = Grades.objects.get(pk=gradeid)

# 对应班级的学生studentList = grade.students_set.all()

# 都是学生信息都是一样显示(即模板是一致的)

# 就是数据源不一样

returnrender(request,'myapp/students.html',{'students':studentList})

链接:https://www.jianshu.com/p/d3b87efb555d

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 切换到创建项目的目录 cd C:\Users\admin\Desktop\DjangoProject创建名为pr...
    在努力中阅读 3,263评论 2 3
  • 模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。软件设计中通常用耦合度和内聚...
    riverstation阅读 2,064评论 0 8
  • 一、Django简介 Django是用Python开发的一个免费开源的Web框架,可以用于快速搭建高性能,优雅的网...
    EndEvent阅读 2,456评论 1 2
  • Web框架之Django: (1)简介: Django是一个由Python写成开源的重量级Web应用框架,采用MT...
    老肖阅读 3,046评论 0 18
  • virtualenv newenv => 新的虚拟环境 source newenv/bin...
    xiaohesong阅读 275评论 0 0