一,安装Django并初始化
- 在合适的目录创建一个项目
- 打开cmd终端进入上一步创建的目录下
- 输入命令
django -admin startproject project
- 目录层级说明:
- manage.py,一个命令行工具,可以使用多种方式对Django项目进行交互
- project\init.py,一个空文件,它告诉Python这个目录应该看做一个Python包
- project\settings.py,项目的配置文件
- project\urls.py,项目的URL声明
- project\wsgi.py,项目与WSGI兼容的web服务器入口
二,配置数据库
- 数据库配置:Django默认使用SQLite数据库,
- 在project文件夹下的init.py 文件中添加以下内容
import pymysql
pymysql.install_as_MySQLdb()
- 在settings文件中查看配置项,数据库做如下修改
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'student', # 数据库名称
'HOST':'192.168.159.6', # IP地址
'PORT':'3306', # 端口号
'USER':'root', # 用户名
'PASSWORD':'123456', # 密码
}
}
三,创建应用
- 应用介绍:一个项目中可以创建多个应用,每个应用只处理一种业务逻辑
- 创建应用:
- 打开cmd窗口,进入project目录下
- 执行以下命令
python manage.py startapp MyApp
- MyApp目录说明:
- admin.py,站点配置
- models.py,模型
- views.py,视图
- 激活应用:
- project目录下,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'
]
四,定义模型
- 模型介绍:数据库中有几张表,就需要定义几个模型;模型中的每个属性,对应该模型对照表中的每个字段
- 模型中属性介绍,详见
https://blog.csdn.net/zhuan_long/article/details/114022089
- 定义模型:在models.py文件中定义模型,代码如下
from django.db import models
class Grade(models.Model):
gradeName = models.CharField(max_length=64)
startTime = models.DateTimeField()
girlNum = models.IntegerField(max_length=64)
boyNum = models.IntegerField(max_length=64)
isDelete = models.BooleanField(default=False)
def __str__(self):
return self.gradeName
class Student(models.Model):
studentName = models.CharField(max_length=64)
studentAge = models.IntegerField(max_length=64)
#grade = models.IntegerField(max_length=64)
# 关联外键
grade = models.ForeignKey("Grade",on_delete=models.DO_NOTHING) # 删除关联数据,什么也不做
isDelete = models.BooleanField(default=False)
# 不需要定义主键,在生成时会自动增加
def __str__(self):
return self.studentName
- 数据表生成迁移文件:打开cmd窗口,进入project目录下,执行以下命令
python manage.py makemigrations
在migrations目录下生成一个迁移文件,此时数据库中还没有数据表
5. 进行文件迁移:打开cmd窗口,进入project目录下,执行以下命令,相当于执行SQL语句创建数据表
python manage.py migrate
五,启动服务器
- 启动服务器的语句:打开cmd窗口,进入project目录下,执行以下命令
python manage.py runserver ip:port
六,Admin站点管理
- 配置Admin应用:在settings.py文件中的INSTALLED_APPS中添加"django.contrib.admin",默认已添加
- 添加管理员账号:打开cmd窗口,进入project目录下,执行以下命令
python manage.py createsuperuser
- Admin站点汉化:修改settings.py文件
LANGUAGE_CODE = "zh-Hans"
TIME_ZONE = "Asia/Shanghai"
- 修改MyApp/admin.py文件
from django.contrib import admin
# Register your models here.
from .models import Grade,Student
# 以下功能实现创建班级时同步创建2个学生
class StudentsInfo(admin.TabularInline): # admin.StackedInline 也可以,创建时样式不同
model = Student
extra = 2
# 注册
@admin.register(Grade) # 使用装饰器注册,后面不需要额外注册语句
class GradesAdmin(admin.ModelAdmin):
# 以下功能实现创建班级时同步创建2个学生
inlines = [StudentsInfo]
# 列表页属性
list_display = ["gradeName","startTime","girlNum","boyNum","isDelete"] # 显示字段
list_filter = ["startTime"] # 过滤字段
search_fields = ["startTime"] # 搜索字段
list_per_page = 5 # 分页字段
# 添加,修改页属性
# fields = ["girlNum","boyNum","gradeName","startTime","isDelete"] # 可以规定属性的先后顺序
fieldsets = [
("num",{"fields":["girlNum","boyNum"]}),
("base",{"fields":["gradeName","startTime","isDelete"]})
] # 分组并规定先后顺序
# fields 与 fieldsets 不能同时生效
@admin.register(Student) # 使用装饰器注册,后面不需要额外注册语句
class StudentAdmin(admin.ModelAdmin):
# 数据库中isDelete是布尔值,使用此方法可以将符号转换为中文
def IsDelete(self):
if self.isDelete == True:
return "已删除"
else:
return "未删除"
def StudentGender(self):
if self.studentGender == True:
return "男"
else:
return "女"
# 设置页面列的名称
StudentGender.short_description = "性别"
IsDelete.short_description = "是否删除"
# 执行动作的位置
actions_on_top = False
actions_on_bottom = True
# 列表页属性
list_display = ["studentName", StudentGender,"studentAge", IsDelete,"grade"] # 显示字段
list_filter = ["studentName"] # 过滤字段
search_fields = ["studentName"] # 搜索字段
list_per_page = 5 # 分页字段
fields = ["studentName","studentGender","studentAge","isDelete","grade"] # 可以规定属性的先后顺序
#admin.site.register(Grade,GradesAdmin)
#admin.site.register(Student,StudentAdmin)
七,视图的介绍
-
概念:在Django中,视图是对web请求进行回应,视图是一个Python函数,在 \Django\MyDjango\project\MyApp\urls.py 中定义
-
配置URL \Django\MyDjango\project\MyApp\urls.py 添加以下内容
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$',views.index),
url(r'^(\d+)/(\d+)$',views.detail)
]
\Django\MyDjango\project\project\urls.py 添加以下内容
from django.contrib import admin
from django.urls import path,include
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^',include('MyApp.urls')),
]
- 定义返回结果:\Django\MyDjango\project\MyApp\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,num1,num2):
return HttpResponse("detail - %s - %s"%(num1,num2))
- 测试验证:重新启动服务,使用浏览器访问127.0.0.1:8000/
八,模板
- 添加模板目录:目录下的settings.py文件修改TEMPLATES部分内容:
\Django\MyDjango\project\project\settings.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',
],
},
},
]
- 目录下创建html文件
- \Django\MyDjango\project\templates\MyApp\grades.html
grades.html 文件中添加内容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级信息</title>
</head>
<body>
<h1>班级信息列表</h1>
<ul>
<li>
<a href="#">班级名称</a>
</li>
<!--[python04,python05,python06]-->
{%for gradeHtml in gradesHtml%}
<li>
<a href="{
{gradeHtml.id}}">{
{gradeHtml.gradeName}}</a>
</li>
{%endfor%}
</ul>
</body>
</html>
- \Django\MyDjango\project\templates\MyApp\students.html
students.html 文件中添加内容
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>学生信息</title>
</head>
<body>
<h1>学生信息列表</h1>
<ul>
<li>
<a href="#">学生姓名--学生年龄--学生班级</a>
</li>
<!--[python04,python05,python06]-->
{%for studentHtml in studentsHtml%}
<li>
<a href="#">{
{studentHtml.studentName}}--{
{studentHtml.studentAge}}--{
{studentHtml.grade_id}}</a>
</li>
{%endfor%}
</ul>
</body>
</h tml>
- 项目的 urls.py 文件中增加路由信息
\Django\MyDjango\project\MyApp\urls.py
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)
]
- 视图文件中指定页面路径:\Django\MyDjango\project\MyApp\views.py 添加
from .models import Grade
def Grades(requset):
# 模板中取数据
GradesList = Grade.objects.all()
# 将数据传递给模板
return render(requset,'MyApp/grades.html',{"gradesHtml":GradesList})
from .models import Student
def Students(request):
StudentList = Student.objects.all()
return render(request,"MyApp/students.html",{"studentsHtml":StudentList})
-
启动服务,重新访问127.0.0.1:8000/grades,127.0.0.1:8000/students即可看到页面内容
-
班级与学生相关联
\Django\MyDjango\project\MyApp\views.py 中增加以下内容
def GradesId(request,Num):
grade = Grade.objects.get(pk = Num)
StudentList = grade.student_set.all()
return render(request,"MyApp/students.html",{"studentsHtml":StudentList})
- 项目URL文件
\Django\MyDjango\project\MyApp\urls.py 中增加以下内容
url(r"^grades/(\d+)$",views.GradesId)
- 重启服务,即可实现点击班级链接,跳转到此班级的学生列表中
九,数据库表改变
- 如果数据库,表结构有改变,需要做如下处理
- 在settings.py 中修改数据库信息
- 对应项目里删除迁移文件
- 数据库中创建项目数据库
- 生成迁移文件
- 执行迁移
- 迁移文件位置,如下图所示