Django基本操作

1. 设计表结构
1.2 班级表结构
表名: Grade
字段
班级名称: Gname
成立时间: gdate
女生总数: ggirlsum
男生总数: gboysum
是否删除: gisdelete
学生表结构
表名: student
字段
学生名字:sname
学生性别:sgender
学生年龄:sage
学生简介:scontend
学生班级:sgrade
是否删除:sisdelete
2. 配置数据库:
注意Django默认SQlite数据库
在Settings.py文件中,通过DATABASES进行数据库配置
配置MySQL
Python.3.x安装的是PyMySQL
在__init__.py文件中写入两行代码
import pymysql
pymysql.install_as_MySQLdb()
格式:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': ‘数据库名’,
'USER': ‘用户名’,
'PASSWORD': ‘数据库密码,’
'HOST': ‘服务器IP’’,
'PORT': ‘端口’,
}
}
3. 创建应用
在一个项目中可以创建多个应用,每个应用进行一种业务处理
打开黑屏终端,进入demo1下的project目录
执行python manage.py startapp myApp
myApp的说明
Admin.py:站点配置
Models.py:模型
Views.py:视图
4. 激活应用
在settings.py文件中将myApp加入到INSTALL_APPS选项中
#激活应用的地方
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myApp',
]
5. 定义模型
#这个类会对应数据库中的一个表
class Grades(models.Model): #不指定主键,会自动生成一个主键
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField()
class Students(models.Model):
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=True) #男:True,
sage = models.IntegerField()
scontend = models.CharField(max_length=20)
isDelete = models.BooleanField(default=False) #False:不删除
sgrade = models.ForeignKey("Grades") #关联外键,关联前面班级类
概述:有一个数据表,就对应一个模型
在models.py文件中定义模型
引入 from django.db.import models
模型类要继承models.Model类
说明:不需要定义主键,会在生成时自动添加,并且值为自动增加的
6. 在数据库中生成数据表:
6.1 生成迁移文件
执行一个命令:python manage.py makemigrations;
在migration目录下生成一个迁移文件,此十数据库中还没有生成表
6.2 执行迁移
执行python manage.py makemigrations;
相当于执行sql语句创建数据库,需要注意此时创建的表明带有myapp前缀
7. 测试数据操作
7.1 进入python shell
执行 python manage.py shell
7.2 引入一些包
From myApp.models import Grades,Students
From django.utils import timezone
From datetime import *
7.3 查询所有数据
类名.objects.all();
样例:Grades.objects.all()
7.4 添加数据
本质:创建一个模型类的对象实例
In [6]: grade1 = Grades()
In [7]: grade1.gname = "python04"
In [8]: grade1.gdate = datetime(year=2017,month=7,day=17)
In [9]: grade1.ggirlnum = 3
In [10]: grade1.gboynum = 70
7.5 查看某个对象
类名.objects.get(pk=2)
Grades.objects.get(pk=2)
7.6 修改
模型对象.属性 = 新值
grade2.gboynum = 60
grade2.save()
7.7 删除数据
模型对象.delete()
Grade2.delete()
注意:物理删除,数据库中的表里的数据被删除了
7.8 关联对象
stu = Students()
In [9]: stu.sname ="学研没"
In [10]: stu.sgender=False
In [11]: stu.sage=20
In [12]: stu.scontend = "我叫学研没"
In [13]: stu.sgrade = grade1
In [14]: stu.save()
7.9 获得关联对象的集合
需求:获取python04班级的学生
格式:对象的名字.类名_set.all()
样例:grade1.students_set.all()
7.10 需求:创建曾志伟,属于python04班级;
stu3 = grade1.students_set.create(sname=u'曾志伟',sgender=True,scontend=u'我是怎知为',sage=45)
注意:直接添加到了数据库中
8. 启动服务器:
8.1 格式:
Python manage.py runserver Ip:port
Ip可以不写,不写的话代表本机ip
端口号默认:8000
Python manage.py runserver
8.2 说明:
这是一个纯python写的轻量级web服务器,仅仅用于开发测试中
9. Admin站点管理
9.1 概述:
内容发布
负责添加,修改,删除内容
公共访问
9.2 配置Admin应用
在settings.py文件中的INSTALL_APP添加’django.contrib.admin’ 一般默认已经添加好了
9.3 创建管理员用户
python manage.py createsuperuser
依次设置用户名,邮箱,密码
sunck,1020559628@qq.com,azxc13320786856
9.4 汉化
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
9.5 管理我们的数据表
修改admin.py文件
from .models import 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 GradesAdmin(admin.ModelAdmin):
#列表页属性
list_display = ['pk','gname','gdate','ggirlnum',
'gboynum','isDelete']
list_filter = ['gname']
search_fields = ['gname']
list_per_page = 5
#添加、修改页属性
# fields = ['ggirlnum', 'gboynum', 'gname', 'gdate', 'isDelete']
fieldsets = [
("num",{"fields":['ggirlnum', 'gboynum']}),
("base", {"fields":['gname', 'gdate', 'isDelete']}),
]
admin.site.register(Grades, GradesAdmin)
9.6 关联对象
需求:在创建一个班级时可以直接添加几个学生
class StudentsInfo(admin.TabularInline): #StackedInline
model = Students
extra = 2
class GradesAdmin(admin.ModelAdmin):
inlines = [StudentsInfo]
9.7 布尔值显示问题:
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
return "女"
#设置页面列的名称
gender.short_description = "性别"
list_display = ['pk', 'sname', 'sage', gender,
'scontend', 'sgrade', 'isDelete']
list_per_page = 10
admin.site.register(Students, StudentsAdmin)
9.8 执行动作位置
执行动作的含义:
代码:
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
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
执行动作的位置发生了变化,执行动作的地方从上面变化到了下面
10. 使用装饰器完成注册
@admin.register(Students) #修饰器
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
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)
与原来得到的结果是一样的;我想这样做的原因是修饰器比较方便,修饰器可能还会有其它的功能(仅仅是猜测)
11.视图的基本使用
11.1 概述
在django中,视图对web请求进行回应
视图就是一个python函数,在view.py文件中进行定义
11.2 定义视图
from django.http import HttpResponse
def index(request): #请求:浏览器给服务器的东西
return HttpResponse("sunck is a good man")
11.3 配置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')), #r转义 include可以跳转
]
在myApp应用目录下创建一个urls.py文件
urlpatterns = [
url(r'^$', views.index),
url(r'^(\d+)/(\d+)$', views.detail), #()是正则表达式里面组的盖帘
]
views.py文件内容:
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request): #请求:浏览器给服务器的东西
return HttpResponse("sunck is a good man")
def detail(request, num,num2):
return HttpResponse("detail-%s-%s"%(num,num2))
12.模板的基本使用
12.1 概述
模板是HTML页面,可以根据视图中传递过来的数据进行填充。
12.2 创建模板
在最外层的project目录中创建templates目录,在目录下创建对应的模板目录(project/templats/myApp),如下图所示;
12.3 配置模板路径
修改settings.py文件下的TEMPLATES;
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
即,将我们自己的templates目录添加进去
12.4 定义grades和students的html模板
模板语法:
{{输出值,可以是变量,也可以是对象.属性}}
{%执行代码段%}
12.5 http://127.0.0.1:8000/grades
写grades.html模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级信息</title>
</head>
<body>
<h1>班级信息列表</h1>
<ul>
<!---[python04, python05]-->
{%for grade in grades%}
<li>
<a href="#">{{grade.gname}}</a>
</li>
{%endfor%}
</ul>
</body>
</html>
定义视图:
from .models import Grades
def grades(request):
#去模板里取数据
gradesList = Grades.objects.all()
#将数据传递给模板,模板再渲染页面,将渲染好的页面返回给浏览器
配置url:
from django.conf.urls import url
from . import views #.代表当前目录
urlpatterns = [
url(r'^$', views.index),
url(r'^(\d+)/(\d+)$', views.detail), #()是正则表达式里面组的盖帘
url(r'^grades/$', views.grades),
url(r'^students/$', views.students),
]
总结一下就是:
首先用户发送请求,project的url接受请求,我们需要将project的url转向我们自己myApp中的url;接着通过url转向我们的view,view从model中拿到数据,然后将数据送个template进行渲染,最后view将渲染后的template返回。
12.6 实际的例子
需求:点击班级,显示对应班级的所有学生
更改的东西:url, view
url:
url(r'^grades/(\d+)$', views.gradesStudents)
view:
def gradesStudents(request, num):
#获得对应id的班级对象
grade = Grades.objects.get(pk=num)
#通过外键连接得到该班级下的所有学生对象
studentsList = grade.students_set.all()
return render(request, "myApp/students.html", {"students":studentsList})
这次写的templates模板
<!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>
总结的知识点:
#获得对应id的班级对象
grade = Grades.objects.get(pk=num)
#通过外键连接得到该班级下的所有学生对象
studentsList = grade.students_set.all()
13. 解决想要增加一张表
- 在models.py文件添加一个类
class Tmptables(models.Model):
tname = models.CharField(max_length=20)
saage = models.IntegerField()
- 执行迁移命令
python manage.py makemigrations
python manage.py migrate
- 查看数据库
14. 解决已经生成了迁移文件但是想要重新迁移
方法一:将迁移文件删除,将数据库文件删除;然后再去执行迁移命令。
删除这个文件: