美文网首页
Django基本流程

Django基本流程

作者: 仙灵儿 | 来源:发表于2018-07-21 22:58 被阅读254次

    一、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

    相关文章

      网友评论

          本文标题:Django基本流程

          本文链接:https://www.haomeiwen.com/subject/dkxhmftx.html