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 单元测试
#在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‘,#应用名称 ]
概述:有一个数据表,就对应有一个模型
在models.py文件中定义模型
引入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")
说明
不需要定义主键,在生成时自动添加,并且值为自动增加
生成迁移文件,执行<python manage.py makemigrations>
在migrations目录下生成一个迁移文件,此时数据库中还没有生成数据表
注意:重新迁移文件的时候,需要把已经迁移的文件进行手动删除,同时把数据库也进行删掉
执行<python manage.py migrate>,相当于执行sql语句创建数据表
进入到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)
注意:直接添加到数据库中
格式
python manage.py runserver ip:port
ip可以不写,不写的话代表本机ip
端口号默认是8000
python manage.py runserver
说明:这是一个纯python写的轻量级web服务器,仅仅在开发测试中使用个
内容发布;负责添加、修改、删除内容;公告访问;配置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)
概述:模板是html页面,可以根据视图中传递的数据值充值
创建模板目录:在模板目录<templates>下创建对应项目名字的目录,用来存放该项目的模板文件
ps:templates目录也可以放在myApp应用目录下
#配置settings.py文件,设置TEMPLATES的DIRS值 定义一个cla.html模板和一个student.html模板 #语法 {{输出值,可以是变量,也可以是对象.属性}} {%执行代码段%}
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),
原文:https://www.cnblogs.com/wendyw/p/12012869.html