环境:
python 3.7.4
django 2.2.6 (此版本生命周期长适合2020年和和2021年学习)
环境搭建步骤在上一个博客django在windows环境搭建
**大致流程
1.创建工程 执行 django-admin startproject project
2.创建项目 执行 python manage.py startapp myApp
3.激活项目 修改settings.py中的INSTALLED_APPS
4.配置数据库 a 修改__init__.py文件
b 修改settings.py文件中的DATABASES
5.创建模型类 在项目目录下的models.py
6.生成迁移文件 执行python manage.py makemigrations
7.执行迁移 执行python manage.py migrate
8.配置站点
9.创建模板目录/项目模板目录
10.在settings.py文件中TEMPLATES配置模板路径
10.在first_project下修改urls.py
11.在项目目录下创建urls.py**
**详细步骤如下
1.first_project/init.py
import pymysql
pymysql.install_as_MySQLdb()
2.first_project/settings.py
因为Django使用默认的是sqlite3,需要更改为mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django', (数据库名)
'USER': 'root', (数据库用户名)
'PASSWORD': '',
'HOST': 'localhost', (本机为 localhost 或直接写 127.0.0.1)
'PORT': '3306', (数据库端口号默认为3306)
}
}
3.创建应用
进入项目终端
然后输入 python manage.py startapp myApp
(出错修改1)若出错则注释 "d:\Python_virtualenvs\django\lib\site-packages\django\db\backends\mysql\base.py" 两行
(出错修改2)"d:\Python_virtualenvs\django\lib\site-packages\django\db\backends\mysql\operations.py"中
把# query = query.decode(errors='replace')
更换为query = query.encode(errors='replace')
myApp目录说明
admin.py 站点配置
models.py 模型
views.py 视图
4.激活应用
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',
]
5.定义模型
概念:一个数据表对应一个模型(在myApp下的models.py中定义模型)
(1)先导入
from django.db import models
(2)新建类(数据库表名)
class Grades(models.Model):
(3)字段(数据库字段)注意gname字段的unique=true设置
gname = models.CharField(max_length=20,unique=True)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)
(4)学生类一样
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',to_field='gname',on_delete='CASCADE')
(5)不需要定义主键,在生成时自动添加,并且值自动增加。
6.生成数据表(在数据库生成数据表)
(1)生成迁移文件(其实就是在midrations目录下生成迁移文件,执行完这一步数据库中还没有数据表)
执行命令(在项目目录下)
python manage.py makemigrations
(2)执行迁移(执行完这一步,数据库多了12个表,其中就有myapp_grades、myapp_students)
python manage.py migrate
7.测试数据操作
(1)进入python shell
执行代码 python manage.py shell
(2)引入一些包
from myApp.models import Grades,Students
from django.utils import timezone
from datetime import *
(3)查询所有数据(类名.objects.all())
Grades.objects.all()
(4)添加数据(本质:创建一个模型类的对象实例)
例如:
grade1 = Grades()
grade1.gname = "信管一班"
grade1.gdate = datetime(year=2017,month=8,day=10)
在这一步时可能会有警告RuntimeWarning: DateTimeField Grades.gdate received a naive datetime (2017-08-10 00:00:00) while time zone support is active.
解决方法:在settings.py 文件中设置 USE_TZ = False 警告错误不再报
grade1.ggirlnum = 13
grade1.gboynum = 20
//保存到数据库(模型和数据库交互)
grade1.save()
查看是否添加,在shell终端可 Grades.objects.all() ,或在数据库中操作 select * from myapp_grades
在shell终端看非常麻烦,可以在models.py中的Grades模型添加函数
(添加完之后 1.需要重启shell 2.重新导入那三个包 3.执行 Grades.objects.all())
def __str__(self):
return "%s__%d__%d"%(self.gname,self.ggirlnum,self.ggirlnum)
(5)查看某个对象
pk=2 就是查询第二个对象(pk = primary key(主键))
Grades.objects.get(pk=2)
(6)修改数据
模型对象.属性 = 新值
例如:
grade2.gboynum = 99
grade2.save() //切记要save()
(7)删除数据
模型对象.delete()
例如:(这是物理删除,删除数据库中的表)
grade2.deleta()
8.关联对象a
(1)代码:
grade1 = Grades.objects.get(pk=1)
stu1 = Students()
stu1.sname = "小王"
stu1.sgender = True
stu1.sage = 20
stu1.scontend = "你好,我叫小王。"
stu1.sgrade = grade1
stu1.save()
执行完毕后在mysql查询语句 select * from myapp_students; 可以发现sgrade字段写了关联Grades类的grade的值。
(2)获得关联对象集合 " 对象名.关联的类的小写_set.all() "
-1- 先建立stu2对象
stu2 = Students()
stu2.sname = "小张"
stu2.sage = 22
stu2.scontend = "你好,我叫老张。"
stu2.sgrade = grade1
stu2.save()
-2- 在shell中执行 grade1.students_set.all() 会发现可以查询到两个对象分别是 stu1、stu2
(3)创建一个属于grade1班级的学生stu3
stu3 = grade1.students_set.create(sname = u'小李', sage = 30, sgender = False, scontend = u'大家好,我是小李。')
注意:u是转码,而且不用save()操作
9.启动服务器(开发测试使用的轻量级web服务器)
格式: python manage.py runserver ip:port
ip和port可以不写,分别默认为 本机 和 8000
10.Admin站点管理
(1)概述:
内容发布:负责添加删除修改内容
公告访问
(2)配置Admin应用(在setting.py文件中的INSTALLED_APPS添加'django.contrib.admin')默认是有的,可忽略
(3)创建管理员用户
执行:python manage.py createsuperuser
然后依次输入用户名、email、密码
在浏览器中直接输入网址 http://127.0.0.1:8000/admin 进入
(4)汉化
在settings.py文件中修改如下,修改完后直接刷新浏览器,不必重启服务器。
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-Hans'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
11.管理数据表
(1)修改admin.py文件
from .models import Grades,Students
# 注册方法1
admin.site.register(Grades)
admin.site.register(Students)
# 注册方法2(使用装饰器注解)
@admin.register(Grades)
@admin.register(Students)
(2)刷新浏览器
(3) -1- 自定义管理页面
class GradeAdmin(admin.ModelAdmin):
#列表页属性
list_display = ['pk','gname','gdate','ggirlnum','gboynum','isDelete'] //显示字段名
list_filter = ['gname'] //过滤字段
search_fields = ['gname'] //搜索字段
list_per_page = 5 //分页,每5个数据一页
#添加修改页属性(fields 和 fieldsets 不能同时使用)
#fields = ['gname','ggirlnum','gboynum','gdate','isDelete'] //规定属性的先后顺序,没有pk
fieldsets = [
("base",{"fields":['gname','gdate','isDelete']}),
("num",{"fields":['ggirlnum','gboynum']})
] //给属性分组
注意要加GradesAdmin类
admin.site.register(Grades, GradesAdmin)
-2- 关联对象
在 可视化页面 创建班级时可以直接添加几个学生
class StudentInfo(admin.TabularInline):
model = Students
extra = 2
但是要在Grades类中添加 inlines = [StudentInfo]
-3- 布尔值显示问题(以性别为例)
def gender(self):
if self.sgender:
return "男"
else:
return "女"
# 设置页面列的名称
gender.short_description = "性别"
list_display = ['pk','sname','sage',gender,'scontend','sgrade','isDelete']
-4- 执行动作的位置
action_on_top = False
action_on_bottom = True
13.视图的基本使用
概念:视图对web请求进行回应,视图就是一个python函数,在views.py中定义
(1)定义视图(views.py):
from django.http import HttpResponse
def index(request):
return HttpResponse("我的第一个django项目!!!")
(2)配置url
-1- 修改project目录下的urls.py文件
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myApp.urls')),
]
-2- 在myApp应用目录下创建一个urls.py文件
from django.urls import path
from . import views
urlpatterns = [
path(r'',views.index())
]
14.模板的基本使用
概述:模板是html页面,可以根据视图中传递来的数据进行填充。
-1- 创建模板目录
创建templates目录,在目录下创建对应的模板目录(django/first_project/templates/myApp)
-2- 配置模板路径(修改settings.py文件下的TEMPLATES)
TEMPLATES = [
{
'DIRS': [os.path.join(BASE_DIR,'templates')],
},
]
-3- 新建 grades.html 和 students.html
模板语法:
1.{{输出值,可以是变量,也可以是一个对象.属性}}
2.{%执行代码%}
-4- http://127.0.0.1:8000/grades
a 写grades.html模板
<h1>班级信息</h1>
<ul>
{%for grade in grades%}
<li>
<a href="#">{{grade.gname}}</a>
</li>
{%endfor%}
</ul>
b 定义视图
from .models import Grades
def grades(request):
# 在模板里取数据
gradeslist = Grades.objects.all()
# 将数据传给模板,模板再渲染页面,视图将渲染好的页面返回浏览器
return render(request,'myApp/grades.html',{"grades":gradeslist})
c 配置url路径(配置myApp下的urls.py就行)
path('grades',views.grades)
-5- 点击班级,显示对应的班级的所有学生
a 定义视图 代码如下:
def gradesstudents(request,number):
#获得对应班级对象
grade = Grades.objects.get(pk=number)
#获得班级下的所有学生
studentslist = grade.students_set.all()
return render(request, 'myApp/students.html',{"students":studentslist})
b 配置url
path('grades/<int:number>',views.gradesstudents)
c 模板
<li>
<a href="grades/{{grade.id}}">{{grade.gname}}</a>
</li>