- 安装
进入终端输入
pip install Django==2.0
等待安装完成,验证是否安装成功,在终端输入
import django
回车后,如果不报错,代表能正常导入django,安装是成功的
- 创建项目
在想要创建项目的目录,在终端进入到这个目录(注意目录不要出现中文),
在终端输入
django-admin startproject [项目名]
==[项目名]自定义==,
回车后,等待项目创建成功(为了下文描述方便,此处的项目名blogproject为例)
终端输入
tree blogproject
查看生成的项目目录结构如下
[图片上传失败...(image-cb2469-1538141956148)]
- 项目目录说明
manage.py - 一个命令行工具,可以使我们与项目进行交互
settings.py - 项目的配置文件
urls.py - 项目的URL声明
wsgi.py - 项目与WSGI兼容的Web服务器入口
- 基本操作
- 设计表结构
(1)班级表结构
表名 grade
字段 | 字段名 |
---|---|
班级名称 | gname |
成立时间 | gdate |
女生总数 | ggirlnum |
男生总数 | gboynum |
是否删除 | isDelete |
(2)学生表结构
表名 students
字段 | 字段名 |
---|---|
姓名 | sname |
性别 | sgender |
年龄 | sage |
简介 | scontend |
所属班级 | sgrade |
是否删除 | isDelete |
2.配置数据库
django默认使用的是sqlite3数据库,这里配置mysql,在settings文件中,通过修改DATABASES选项进行数据库配置,
(1)先安装python3的mysql链接工具,这里使用的是pymysql
pip install pymysql
(2)在项目的的init.py中写入
import pymysql
pymysql.install_as_MySQLdb()
(3)新建一个数据库(blog),下面的配置要用到,在settings中修改的内容如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog',#数据库名
'USER': 'root',#数据库用户名
'PASSWORD':'root',#数据库密码
'HOST': '127.0.0.1',#数据库地址
'PORT': '3306',#端口号
}
}
3.创建应用
在一个项目中可以创建多个应用,每个应用进行一种业务处理,在终端进入之前新建的项目目录(blogproject),输入
python3 manage.py startapp blog
即在当前项目下新建一个应用名为blog的应用,此时的目录结构
[图片上传失败...(image-6b81ae-1538141956148)]
目录说明
admin.py 站点配置
models.py 模型
views.py 视图
在settings.py文件中,将上面新建的app(blog)加入注册到项目中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]
4.定义模型
在models.py中定义上面数据表结构对应的模型,所有的模型继承==models.Model==
- 班级模型
from django.db import models
class Grade(models.Model):
gname = models.CharField(max_length=20,verbose_name='班级')
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField()
一个模型类对应数据库中的一张表,类里的属性对应表中的一个字段
- 学生模型
class Student(models.Model):
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.CharField(max_length=100)
isDelete = models.BooleanField(default=False)
sgrade = models.ForeignKey("Grade",on_delete=models.CASCADE)
在定义模型的时候,不需要定义主键,在数据迁移时,自动生成主键,并且值为自动增加的
5.生成数据表
执行如下命令生成迁移文件
python manage.py makemigrations
==注意:== 此时只是在migrations目录下生成了迁移文件,并没有生成数据表,若生成数据表,需要进一步执行迁移命令
python manage.py migrate
- 启动服务器
执行如下命令启动测试服务器
python manage.py runserver ip:port
==ip:port== 可不写,代表使用默认的ip地址和端口号
127.0.0.1:8000
7.站点管理
- 配置admin应用
在settings.py文件中的INSTALLED_APPS中添加‘django.contrib.admin’,这个站点管理应用在新建项目的时候已经自动添加了,但是若想要进行站点管理,需要管理员登录到站点管理后台,需要创建一个超级管理员账号,用到如下命令
python manage.py createsuperuser
按照提示依次输入用户名,Email,密码,创建完成,在测试服务器启动的情况下,在浏览器中打开127.0.0.1:8000/admin进入站点管理页面,输入刚才创建管理员时输入的用户名和密码,看到页面为英文,若改为汉语
,在settings.py的配置中修改
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
再次打开站点管理页面,可以看到汉语页面。
- 管理数据表
- 修改admin.py 文件,将模型注册到站点管理中
from .models import Grade, Student
# 注册
admin.site.register(Grade)
admin.site.register(Student)
刷新站点管理后台,看到项目中的两个模型Grade 和Student已经被注册到管理后台了。
- 自定义管理页面
修改注册model的各个属性,
常用属性如下:
from .models import Grade, Student
class GradeAdmin(admin.ModelAdmin):
# 列表页属性
# list_display 要显示的属性
# list_filter 过滤器
# search_fields 搜索字段
# list_per_page 分页
list_display = ['pk', 'gname', 'gdate', 'ggirlnum', 'gboynum', 'isDelete']
list_filter = ['gname']
search_fields = ['gname']
list_per_page = 3
# 添加 修改属性
# fields 修改字段显示顺序
# fieldsets 字段分组展示
# 以上两个属性不能同时使用
# fields = []
fieldsets = [
('num',{'fields':['ggirlnum','gboynum']}),
('base',{'fields':['gname','gdate','isDelete']})
]
class SutdentAdmin(admin.ModelAdmin):
list_display = ['pk', 'sname', 'sgender',
'sage', 'scontend', 'sgrade', 'isDelete']
list_filter = ['sgrade']
search_fields = ['sname']
list_per_page = 3
# 注册
admin.site.register(Grade, GradeAdmin)
admin.site.register(Student, SutdentAdmin)
- 关联对象
==需求:在创建一个班级时可以直接添加几个学生==
在admin.py中编辑如下代码
class StudentInfo(admin.TabularInline):
model = Student
extra = 2
class GradeAdmin(admin.ModelAdmin):
inlines = [StudentInfo]
...
得到修改后的添加Grade页面如下
[图片上传失败...(image-2245e0-1538141956148)]
- Boolean值显示问题
==需求:将学生的管理页面展示的True和False对应的标记改成“男”和“女”==
class SutdentAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
else:
return "女"
#设置页面列的名称
gender.short_description = "性别"
...
- 使用装饰器完成注册
不需要使用
admin.site.register(Grade, GradeAdmin)
admin.site.register(Student, SutdentAdmin)
完成模型的注册,使用装饰器注册模型方式如下
@admin.register(Student)
class SutdentAdmin(admin.TabularInline):
...
@admin.register(Grade)
class GradeAdmin(admin.ModelAdmin):
...
- 视图
定义一个视图
from django.http import HttpResponse
def index(request):
return HttpResponse("django is a web framework")
这样就定义了一个简单的没有用到模板的视图
若要访问定义好的视图,需要修改urls.py,配置该视图对应的访问路径。一般为了维护方便,各个app有自己的urls.py用来进行视图路径的配置管理,即在myApp下新建urls.py文件,同时需要在项目的urls.py中包含这个文件。
project下的urls.py文件配置:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('myApp.urls'))
]
应用下的urls.py文件配置:
from django.urls import path
from . import views
urlpatterns = [
path('',views.index)
]
- 模板基本使用
在项目目录下创建templates目录,在该文件夹下创建应用对应的文件夹,此处为myApp,避免不同的应用会存在同名的模板文件,或者一个项目中的模板文件过多,不易维护,模板文件夹创建完成后,要在settings.py中配置模板的路径。
在项目的settings.py中有个一句
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(file)))
‘BASE_DIR’ 代表了当前项目的根目录
要配置模板对应的路径只需要在BASE_DIR路径后拼接上templates就可以了,即修改settings.py下的TEMPLATES列表为:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
在templates下定义两个模板分别为grade.html和student.html,在grades.html中展示班级的相关信息,在students.html中显示学生相关信息。
==需求:输入http://127.0.0.1:8000/grades访问班级信息列表,输入http://127.0.0.1:8000/students访问学生信息列表==
编写grades.html模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>班级信息</title>
</head>
<body>
<h1>班级信息列表</h1>
<ul>
{% for grade in grades%}
<li><a href="#">{{grade.gname}}</a></li>
{% endfor %}
</ul>
</body>
</html>
编写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}}</li>
{%endfor%}
</ul>
</body>
</html>
创建grades对应的视图方法
def grades(request):
#去模型中取数据
grades = Grade.objects.all()
#将数据传递个模板,模板负责渲染页面
return render(request,'myApp/grades.html',{'grades':grades})
创建students模板对应的视图
def students(request):
students = Student.objects.all()
return render(request,'myApp/students.html',{'students':students})
在应用的url.py中配置url分发
from django.urls import path
from . import views
urlpatterns = [
path('',views.index),
path('grades/',views.grades),
path('students/',views.students),
]
==需求:点击班级信息列表中的班级链接,展示该班级对应的学生。==
修改grades.html模板
...
<li><a href="{{grade.id}}">{{grade.gname}}</a></li>
...
添加gradesStudents视图
def gradesStudents(request,gradeId):
grade = Grade.objects.get(pk=gradeId)
students = grade.student_set.all()
return render(request,'myApp/students.html',{'students':students})
修改myApp下额urls.py
from django.urls import path,re_path
from . import views
urlpatterns = [
path('',views.index),
path(r'grades/',views.grades),
path(r'students/',views.students),
path('grades/<int:gradeId>',views.gradesStudents),
# re_path(r'grades/(?P<gradeId>\d+)',views.gradesStudents),
]
==注意:== 这里是django2.0的url匹配方式,和django1.x是有区别的,若是用正则,需要引入re_path模块,以上urlpatterns代码 中的最后两句,都可以正确匹配以上的需求。