Django 框架基本操作(二)
一、设计表结构
1.班级表结构
表名:grade
字段:班级名称(gname)、成立时间(gdate)、女生总数(ggirlnum)、男生总数(gboynum)、是否删除(isDelete)
2.学生表结构
表名:student
字段:学生姓名(sname)、学生性别(sgender)、学生年龄(sage)、学生简介(scontend)、所属班级(sgrade)、是否删除(isDelete)
二、配置数据库
注意:Django默认使用SQLite数据
在settings.py文件中,通过DATABASES选择进行数据库配置
配置MySQL
python3.x安装的是PyMySQL
#格式 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 数据库名称, 'USER': 用户名, 'PASSWORD':密码, 'HOST':数据库服务器ip, 'PORT':端口, } }
#在__init__.py文件中写入两行代码 import pymysql pymysql.install_as_MySQLdb() #在settings.py中修改Dababases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'myblog', 'USER': 'root', 'PASSWORD':'mybolg', 'HOST':'localhost', 'PORT':'3306', } }
三、创建应用
在一个项目中可以创建多个应用,每个应用都有一个业务处理
打开黑屏终端进入myblog目录下的project目录
#执行命令,myApp是应用名称 python manage.py startapp myApp myApp目录说明: Admin 站点配置,django为我们提供的后台管理 models.py模型,ORM,写指定的类,通过命令可以创建数据库结构 view.py视图,业务代码 apps配置当前app migration数据修改表结构 tests 单元测试
1.激活应用
#在settings.py文件中,将myApp应用加入到INSTALLED_APPS选项中 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'myApp',#应用名称 ]
2.定义模型
概述:有一个数据表,就对应有一个模型
#在models.py文件中定义模型,引入models from django.db import models #模型类要继承models.Model类 class Grades(models.Model): gname = models.CharField(max_length= 20) gdate = models.DateTimeField() ggirlnum = models.IntegerField() gboynum = models.IntegerField() isDelete = models.BooleanField(default=False) # def __str__(self): # return "%s-%d-%d"(self.gname,self.gdate,self.ggirlnum,self.gboynum) class Students(models.Model): sname = models.CharField(max_length=20) sgender = models.BooleanField(default=True) sage = models.IntegerField() scontend = models.CharField(max_length=20) isDelete = models.BooleanField(default=False) #关联外键 sgrade = models.ForeignKey("Grades") #说明:不需要定义主键,在生成时自动添加,并且值为自动增加
3.在数据库中生成数据表
#在migrations目录下生成一个迁移文件,执行命令 python manage.py makemigrations
在migrations目录下生成一个迁移文件,此时数据库中还没有生成数据表
注意:重新迁移文件的时候,需要把已经迁移的文件进行手动删除,同时把数据库也进行删掉
4.执行迁移
#执行迁移,相当于执行sql语句创建数据表 python manage.py migrate
5.测试数据操作
#进入到python shell,执行命令 python manage.py shell #引入包 from myApp.models import Grades,Students from django.utils import timezone from datetime import * #查询所有数据 类名.objects.all() Grades.object.all() #添加数据 #本质:创建一个模型类的对象 >>>grade1=Grades() >>>grade1.gname="python04" >>>grade1.gdate=datetime(year=2017,month=7,day=17) >>>grade1.ggirlnum=3 >>>grade1.gboynum=70 >>>grade1.save() #models.py在grades类中添加一个__str__方法 class Grades(models.Model): gname = models.CharField(max_length= 20) gdate = models.DateTimeField() ggirlnum = models.IntegerField() gboynum = models.IntegerField() isDelete = models.BooleanField(default=False) def __str__(self): return "%s-%d-%d"(self.gname,self.gdate,self.ggirlnum,self.gboynum) #查看某个对象 类名.objects.get(pk=2) Grades.objects.get(pk=2) #修改数据 模型对象.属性=新值 grade2.gboynum=60 grade2.save() #删除数据 模型对象.delete() grade2.delete() #注意:物理删除,数据库中的表里的数据被删除了 #关联对象 >>>stu = Students() >>>stu.sname ="薛艳梅" >>>stu.sgender=False >>>stu.sage =20 >>>stu.scontend="我叫薛艳梅" >>>stu.sgrade=grade1 >>>stu.save() #获得关联对象的集合 #需求:获取python04班级的所有学生 对象名.关联的类名小写_set.all() grade1.students_set.all() #需求:创建曾大大,属于python04班级stu3=grade1.students_set.create(sname=u'曾大大',sgender=True,scontend=u'我叫曾大大',sage=45) #注意:直接添加到数据库中
6.启动服务器
格式
python manage.py runserver ip:port
ip可以不写,不写的话代表本机ip
端口号默认是8000
python manage.py runserver
说明:这是一个纯python写的轻量级web服务器,仅仅在开发测试中使用个
7.Admin站点管理
内容发布;负责添加、修改、删除内容;公告访问;配置Admin应用
在settings.py文件中的INSTALLED_APPS中添加‘django.contrib.admin’,默认已经是配置好了的
创建管理员用户,执行<python manage.py createsuperuser>,依次输入用户名、邮箱、密码、汉化
#在settiongs.py文件中修改: LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' LANGUAGE_CODE = 'zh-Hans' TIME_ZONE = 'Asia/Shanghai'
#管理数据表,修改admin.py文件 from .models import Grades,Students #注册 admin.site.register(Grades) admin.site.register(Students) #自定义管理页面,属性说明,列表页属性:list_display、显示字段:list_filter、过滤字段:search_fields、搜索字段:list_per_page、分页、添加、修改页属性:fields、属性的先后顺序:fieldsets、给属性分组 注意:fields与fieldsets不能同时使用 #关联对象 #需求:在创建一个班级时可以直接添加几个学生 class StudentsInfo(admin.TabularInline): #StackedInline model = Students extra =2 class GradeAdmin(admin.ModelAdmin): inlines = [StudentsInfo] #布尔显示问题 from .models import Grades,Students #注册 class GradeAdmin(admin.ModelAdmin): #列表页属性 list_display = ['pk','gname','ggirlnum','gboynum','isDelete'] list_filter = ['gname'] list_per_page = 5 search_fields = [ 'gname'] #添加、修改页属性 fields = ['ggirlnum','gboynum','gname','gdate','isDelete'] fieldsets =[ ("num",{"fields":['ggirlnum','gboynum']}), ("base",{"fields":['gname','gdate','isDelete']}), ] admin.site.register(Grades,GradeAdmin) 执行动作的位置 class StudentsAdmin(admin.ModelAdmin): def gender(self): if self.gender(): return "男" else: return "女" #设置页面列的名称 gender.short_description="性别" list_display =['pk','sname''sage',gender,'scontend','sgrade','isDelete'] list_per_page =10 #执行动作的位置 actions_on_top = False actions_on_bottom = True admin.site.register(Students,StudentsAdmin) 使用装饰器完成注册 @admin.register(Students) class StudentsAdmin(admin.ModelAdmin): def gender(self): if self.gender(): return "男" else: return "女" #设置页面列的名称 gender.short_description="性别" list_display =['pk','sname''sage',gender,'scontend','sgrade','isDelete'] list_per_page =10 #执行动作的位置 actions_on_top = False actions_on_bottom = True #admin.site.register(Students,StudentsAdmin) 实例: 1、在settings.py里修改数据库名 2、在settings.py里修改数据库密码 3、删除迁移文件 4、在数据库中创建对应第一步的数据库 5、执行生成迁移文件 6、执行迁移 7、启动服务 8、浏览器测试
四、视图的基本使用
在django中,视图对web请求进行回应,视图接收request对象作为第一个参数,包含了请求的信息.
视图就是一个python函数,在views.py文件中定义
#定义视图 from django.http import HttpResponse def index(request): return HttpResponse("sunck is a good man") def detail(request,id): return HttpResponse("detail %s"%id)
#修改project1目录下的urls.py文件 from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url('^admin', admin.site.urls), url('^', include('myApp.urls')), ]
#修改myApp目录下的urls.py文件 from django.conf.urls import url from . import views urlpatterns = [ url('^$', views.index), url('^(\d+)/', views.detail), ]
五、模板的扩展
#写students.html模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>学生信息</title> </head> <body> <h1>学生信息列表</h1> <ul> {% for student in students %} <li>{{ student.sname}}--{{ student.scontend }}--{{ student.sgrade }}</li> {% endfor %} </ul> </body> </html> #定义视图 from .models import Students def students(request): studentsList = Students.objects.all() return render(request,'myApp/students.html',{"students":studentsList}) #配置url url(r'^students/$', views.students),
#需求:点击班级,显示对应班级的所有学生,定义视图 def gradeStudents(request,num): #获得对应的班级对象 grade = Grades.objects.get(pk=num) #获得班级下的所有学生对象列表 studentsList = grade.students_set.all() return render(request,'myApp/students.html',{"students":studentsList}) #配置url url(r'^grades/(\d+)$',views.gradeStudents)
1.模板的基本使用
概述:模板是html页面,可以根据视图中传递的数据值充值
创建模板目录:在模板目录<templates>下创建对应项目名字的目录,用来存放该项目的模板文件
ps:templates目录也可以放在myApp应用目录下
#配置settings.py文件,设置TEMPLATES的DIRS值 定义一个cla.html模板和一个student.html模板 #语法 {{输出值,可以是变量,也可以是对象.属性}} {%执行代码段%}
2.在view.py中使用模板文件
from . models import classInfo #显示班级信息 def classlist(request): #获取所有班级信息 classlist=classInfo.objects.all() #渲染模板返回页面 return render(request,'myApp/grades.html',{"class":classlist}) #在cla.html模板中添加数据 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>班级列表</h1> <ul> {% for cla in classlist %} <li><a href='#'>{{ cla.cname }}</a></li> {% endfor %} </ul> </body> </html> from .models import Students def students(request): studentsList = Students.objects.all() return render(request,'myApp/student.html',{"stu":studentsList}) #在student.html模板加载数据 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>学生信息</title> </head> <body> <h1>学生信息列表</h1> <ul> {% for student in students %} <li>{{ student.sname}}--{{ student.scontend }}--{{ student.sgrade }}</li> {% endfor %} </ul> </body> </html> #在myApp目录下的urls.py文件中配置路由 url(r'^cla/$',views.classlist), url(r'^students/$',views.studnet),