1.MVT框架
Model(模型):数据库交互相关。在这部分一般需要进行三个操作:
(1)面向数据库:模型对象、列表
(2)定义模型类:指定属性及类型,确定表结构(设计表),需要迁移(生成表)
(3)后台管理:创建管理员,启动服务器,admin,注册admin.py,就可以在admIn中完成表的增删改查
View(视图):核心,负责业务逻辑,获取请求(从URL控制器),获取数据(从Models获取数据),返回结果(结果给Template)、配置URL(自己的应用中配置)
Template(模板):放所有html(前端模板)文件、
加载:读取文件内容到内存
渲染:根据模板填入数据
展示的内容和我的处理逻辑不相关----解耦的思想
图解:
2.入门例子
(1)安装Django
pip install django #后面可接版本号
查看版本号(这里使用的是django 2.0.2版本)
# 版本查看(进入python shell) import django django.get_version()
(2)创建项目
django-admin startproject 项目名称
manage.py :启动文件
settings.py:项目设置,数据库信息,调试标志及其他工作变量
urls.py :路由,路径与视图函数的映射关系
wsgi.py:项目与WSGI兼容的服务器入口,runserver命令就能使用wsgiref模块做简单web服务
用pycharm创建项目(专业版)
结果:
(3)创建应用
cd 项目名称 pyhton manage.py startapp 应用名称
(4)定义模型类(models.py)
实际上就是定义表结构,并生成表
定义模型(表结构)models.py文件
from django.db import models # Create your models here. class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateTimeField() def __str__(self): return "%s" % self.btitle class HeroInfo(models.Model): hname = models.CharField(max_length=20) hgender = models.BooleanField() hcontent = models.CharField(max_length=100) hBook = models.ForeignKey("BookInfo",on_delete=models.CASCADE,) def __str__(self): return "%s" % self.hname
激活模型(编辑setting.py文件,将APP加入到install_apps)----或者说把应用注册到项目里面
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest', ]
生成迁移文件(实际上就是生成上述表结构对应的SQL语句)
python manage.py makemigrations
执行迁移(实际上就是利用上面SQL语句生成对应的表)
python manage.py migrate
建立管理员账户(为了进行表的管理)
python manage.py creatsuperuser # 按照提示依次输入账号、邮箱、密码(不能全是数字缺大于8位)
管理界面中文(设置Settings.py文件)
LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'
把模型类注册到管理里面去(admin.py,这个文件就用作管理的)-----后台管理
from django.contrib import admin # python3 写法 from .models import * # Register your models here. # 关联注册 (内部停靠), # class HeroInfoline(admin.StackedInline): # 表格效果 class HeroInfoline(admin.TabularInline): # 嵌入哪个类(一对多中,多的部分) model = HeroInfo # 增加一本图书的时候,还可以增加2个heroinfo extra = 2 class BookInfoAdmin(admin.ModelAdmin): # 列表页显示 # 列表 list_display = ['id', 'btitle', 'bpub_date'] # 过滤 list_filter = ['btitle'] # 搜索(支持模糊查询) search_fields = ['btitle'] # 分页(每页显示多少条) list_per_page = 10 # 添加页,修改页 # 展示列表fields 和 fieldsets只能同时存在一个,功能一致 # fields = ['bpub_date','btitle'] # 分组 fieldsets = [ ('base', {'fields': ['btitle']}), ('super', {'fields': ['bpub_date']}) ] # 关联注册第二步,关联起来(一对多中,一的部分) inlines = [HeroInfoline] # admin.site.register(BookInfo) # 注册 admin.site.register(BookInfo, BookInfoAdmin) admin.site.register(HeroInfo)
(5)定义视图(views.py)----本质就是函数
from django.shortcuts import render # response request from django.http import * # 引用模板需要需要引入的包;loader(加载) from django.template import RequestContext, loader # 通过模型类拿数据 from .models import * # Create your views here. # 这里要创建index页面 def index(request): ''' # 加载模板 temp = loader.get_template('booktest/index.html') # 渲染模板,执行模板内容render() return HttpResponse(temp.render()) ''' # 通过模型查数据 bookList = BookInfo.objects.all() # 传入的数据 context = {'list':bookList} # 封装成render函数 一步即可 return render(request, 'booktest/index.html',context)
(6)配置url(urls.py)
主urls
from django.contrib import admin from django.urls import path from booktest import views # 分发urls from django.conf.urls import include urlpatterns = [ path('admin/', admin.site.urls), # 正则 path('index/', views.index), # 分发urls,使用APP里面配置urls path('',include('booktest.urls')), ]
一般为了防止主urls挂掉,影响全部APP,会在每个APP里面建立分urls(在app里创建urls.py文件)
from django.urls import path from booktest import views urlpatterns = [ path('123/', views.index), ]
(7)创建模板(template)
为了简化在views里面对数据的处理,在项目同级目录建立template文件夹,并根据APP名称建立对应的文件夹,在文件夹里在建立模板
为了能导入模板,除了上面在views.py的设定外,还需要在setting.py中设定模板路径
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', # 去哪个目录找模板 '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', ], }, }, ]
index.html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> </head> <body> {#遍历list#} {% for book in list %} <li>{{book.btitle}}</li> {% endfor %} </body> </html>
(0)运行django ---创建好Django,随时都可以进行
python manage.py runserver
运行结果