什么是Django?:(web框架)

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。
他功能强大且丰富,文档全面且完善,开发效率高,是Python中的主流web框架;
Django框架是基于MVT框架模式,即模型M,模板T和视图V;
实际上,MVT框架又来源于MVC框架,下面介绍下MVC框架:

MVC框架和MVT框架

MVC框架

MVC: 即Model-View-Controller(模型-视图-控制器)三个单词的首字母缩写,是一种web设计的经典模式
核心思想: 解耦。MVC分离了数据处理和界面显示的代码,使得程序可以在不修改数据处理相关逻辑的前提下,方便地切换不同的显示界面
目的: 提高程序的扩展性和可维护性。
MVC框架的三个组成部分:
m表示model,主要用于对数据库层的封装
v表示view,用于向用户展示结果
c表示controller,是核心,用于处理请求、获取数据、返回结果

python3 mvc开发_python3 mvc开发

MVT框架

MVT框架是Django自己实现的MVC框架,因为Django更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式

MVT的三个组成部分:

m表示model,负责与数据库交互

v表示view,是核心,负责接收请求、获取数据、返回结果

t表示template,负责呈现内容到浏览器

python3 mvc开发_python3 mvc开发_02

Django基础操作

创建虚拟环境

conda create -n Django python==3.6

###激活虚拟环境

source activate Django

在虚拟环境内安装django

pip install django==1.10   ####django==1.10,指定了django的版本

新建一个Django项目

django-admin startproject Django

数据库设置

python manage.py makemigrations   #相当于初始化数据库表
python manage.py migrate #相当于数据库迁移命令,这里的数据库存储都是放在db.sqlite3文件里
python manage.py createsuperuser #创建超级用户,生成db.sqlite3文件
python manage.py runserver 8000 #默认端口号:8000,可以换其他

访问http://127.0.0.1:8000/,可以看见It worked页面,但还没有真正的运行APP

python3 mvc开发_django_03

修改语言,时区(setting.py)

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

Django不同于flask,不需要在每次修改代码时,重启程序。

创建自己的应用(app) – book

python manage.py startapp book

创建好自己的应用文件后,首先在项目里注册应用setting.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book',
]

写数据库结构(model.py)

首先确定数据库表有哪些:书籍、人物。
然后确定每个表的结构,书籍的属性有:id,标题,出版时间,摘要,封面。人物属性:id,姓名,性别,简介,所属书籍。
最后确定表之间的关系:一个书籍里面有多个人物,人物数据库表写外键

在django框架结构里,不需要像flask写反向引用

# book/models.py
from django.db import models

# Create your models here.
class BookInfo(models.Model):
    # 这里不需要写id,Django框架默认会生成id,并作为主键pk
    btitle = models.CharField(max_length=100,unique=True,verbose_name='书籍标题')     # 表示在后台管理中这一栏的中文显示
    bpub_time  = models.DateField(verbose_name='出版时间')
    # bcontent = models.TextField(default='摘要',verbose_name='书籍摘要')
    # bimg = models.ImageField(default=None,upload_to='static/uploads/')
    class Meta:    ##表示这个数据库表在后台中的中文显示,因为英语区分单复数,所以需要写上单复数的中文显示
        verbose_name = '书籍信息'
        verbose_name_plural = '书籍信息'
    def __str__(self):
        return '%s' %(self.btitle)

class HeroInfo(models.Model):
    hname = models.CharField(max_length=50,verbose_name='人物姓名')
    hgender = models.BooleanField(default=True,verbose_name='人物性别')
    # 任务简介
    hcontent = models.TextField(verbose_name='人物简介')
    # 多的一端写外键
    hbook = models.ForeignKey(BookInfo,verbose_name='所属书籍')
    @property
    def gender(self):
        if self.hgender:
            return '男'
        else:
            return '女'
    class Meta:
        verbose_name = '人物信息'
        verbose_name_plural = '人物信息'
    def __str__(self):
        return '%s' %(self.hname)

使用sqlite3文件类型数据库

Django默认使用sqlit3数据库,可在项目的setting.py文件中查看

DATABASES = {
    'default': {
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
     }
}

写好应用book的models.py文件后,我们开始创建数据库

python manage.py makemigrations   
python manage.py migrate

如何进入sqlite3数据库表

python manage.py shell #打开类似数据库交互命令的窗口

数据库的增添数据

>>> from book.models import BookInfo,HeroInfo
>>> from datetime import date
>>> book1 = BookInfo(btitle='笑傲江湖',bpub_time=date(2018,8,8))
>>> book1.save()

数据库的查找

>>> BookInfo.objects.all()
<QuerySet [<BookInfo: 笑傲江湖>]>

根据指定信息查找

>>> book = BookInfo.objects.get(id=1)
>>> book.btitle
'笑傲江湖'

数据库数据的修改

>>> book1.btitle = '神雕侠侣'
>>> book1.save()
>>> book = BookInfo.objects.get(id=1)
>>> book.btitle
'神雕侠侣'

数据库数据的删除

>>> book = BookInfo.objects.get(id=1)
>>> book.delete()
(1, {'book.HeroInfo': 0, 'book.BookInfo': 1})
>>> book = BookInfo.objects.all()
>>>

数据库表之间的关联

创建没有外键的数据库表信息

>>> book1 = BookInfo(btitle='笑傲江湖',bpub_time=date(2018,8,8))
>>> book2 = BookInfo(btitle='神雕侠侣',bpub_time=date(2018,10,1))
>>> book1.save()
>>> book2.save()

根据已知的书籍对应的人物信息中添加人物

>>> book1 = BookInfo.objects.get(id=2)
>>> book1.heroinfo_set.all()
<QuerySet [<HeroInfo: 令狐冲>, <HeroInfo: 杨过>]>
>>> book1.heroinfo_set.create(hname='令狐冲',hgender=True,hcontent='独孤九剑')
<HeroInfo: 令狐冲>

查询人物信息有两种方式

根据人物数据库表直接查找

>>> HeroInfo.objects.all()
<QuerySet [<HeroInfo: 令狐冲>, <HeroInfo: 杨过>]>

根据与数据对象的关系查找

>>> book1 = BookInfo.objects.get(id=2)
>>> book1.heroinfo_set.all()
<QuerySet [<HeroInfo: 令狐冲>, <HeroInfo: 杨过>]>

使用mysql文件类型数据库

修改setting.py文件中的数据库配置

# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'firstdjango',    #数据库名称,若没有的话,先在数据库中建立
        'USER': 'root',
        'PASSWORD': 'sheen',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

这里若直接初始化数据库会报错

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named ‘MySQLdb’

需要对项目的__init__.py文件进行设置

# \PycharmProjects\FristDjango\FristDjango\__init__.py
import pymysql
pymysql.install_as_MySQLdb()

终端运行命令,在mysql数据库中,就可以查看到所有的表信息

python manage.py makemigrations  
 python manage.py migrate

站点对数据库的操作

通过命令对数据库的操作尤不方便,我们通过后台管理的网页来实现对数据库的操作
首先需在admin.py文件中注册数据库表

#book/admin
from django.contrib import admin
from book.models import BookInfo,HeroInfo
# Register your models here.
admin.site.register(BookInfo)
admin.site.register(HeroInfo)

书籍信息只显示标题,和人物信息只显姓名,不利于查看,修改注册的表结构

#book/admin.py
from django.contrib import admin
from book.models import BookInfo,HeroInfo

# Register your models here.

class BookInfoAdmin(admin.ModelAdmin):
    list_display = ['btitle','bpub_time']

class HeroInfoAdmin(admin.ModelAdmin):
    list_display = ['hname','hgender','hcontent','hbook']   #显示栏
    list_filter = ['hbook'] #过滤器
    search_fields = ['hname','hbook']   #搜索栏
    list_per_page = 2   #每页显示多少条数据
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)