1.项目创建
1.1 创建django项目
创建项目的命令如下:
bash
django-admin startproject test1
创建成功后的文件夹如下图:

init.py: 说明test1是一个python包。
settings.py: 项目的配置文件。
urls.py: 进行url路由的配置。
wsgi.py: web服务器和Django交互的入口。
manage.py: 项目的管理文件。
1.2 创建django app
一个项目由很多个应用组成的,每一个应用完成一个功能模块。
创建app的命令如下:
bash
python manage.py startapp booktest
创建好后目录如下:

init.py: 说明目录是一个Python模块。
models.py: 写和数据库项目的内容, 设计模型类。
views.py: ,接收请求,进行处理,与M和T进行交互,返回应答。定义处理函数,视图函数。
tests.py: 写测试代码的文件。
admin.py: 网站后台管理相关的文件。
1.3 app注册
建立应用和项目之间的联系,需要对应用进行注册。
修改settings.py中的INSTALLED_APPS配置项
如下图所示:

1.4 启动项目
启动项目命令如下:
bash
python manage.py runserver
2.模型类
2.1 ORM
django中内嵌了ORM框架,ORM框架可以将类和数据表进行对应起来,只需要通过类和对象就可以对数据表进行操作。
在Django中主要是设计类:模型类。
ORM另外一个作用:根据设计的类生成数据库中的表。
2.2 在settings中配置数据库
原本是下图所示:

我们要改为:
python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '数据库名称',
'HOST':'127.0.0.1',
'PORT':'3306',
'USER':'mysql用户名',
'PASSWORD':'mysql密码',
}
}
2.3 模型类设计
在应用models.py中设计模型类。
必须继承与models.Model类。
- 设计BookInfo类。
- 设计HeroInfo类。
Models.ForeignKey可以建立两个模型类之间一对多的关系,django在生成表的时候,就会在多端的表中创建一列作为外键,建立两个表之间一对多的关系。
代码如下:
python
# 从 Django 的数据库模块中导入 models 类,用于定义数据库模型
from django.db import models
# Create your models here.
# 定义一个名为 BookInfo 的模型类,继承自 models.Model,用于表示图书信息
class BookInfo(models.Model):
# 定义一个字符类型的字段 title,用于存储图书的标题,最大长度为 128 个字符
title = models.CharField(max_length=128)
# 定义一个日期类型的字段 publist_date,用于存储图书的出版日期
publist_date = models.DateField()
# 定义 __str__ 方法,当打印 BookInfo 模型的实例时,返回图书的标题
def __str__(self):
return self.title
# 定义一个名为 HeroInfo 的模型类,继承自 models.Model,用于表示英雄信息
class HeroInfo(models.Model):
# 定义一个字符类型的字段 name,用于存储英雄的名字,最大长度为 50 个字符
name = models.CharField(max_length=50)
# 定义一个布尔类型的字段 gender,用于存储英雄的性别,默认值为 False(通常可以约定 False 为女性,True 为男性)
gender = models.BooleanField(default=False)
# 定义一个字符类型的字段 comment,用于存储关于英雄的描述信息,最大长度为 128 个字符
comment = models.CharField(max_length=128)
# 定义一个外键字段 hbook,关联到 BookInfo 模型。当关联的 BookInfo 实例被删除时,
# 该英雄信息也会被级联删除(on_delete=models.CASCADE)
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
# 定义 __str__ 方法,当打印 HeroInfo 模型的实例时,返回英雄的名字
def __str__(self):
return self.name
2.4 模型类生成表
1、生成迁移文件,命令如下:
python
python manage.py makemigrations
2、执行迁移生成表
python
python mange.py migrate
生成迁移的文件在如下图的目录下:

3.后台管理
3.1 配置settings文件
语言和时区的本地化。
修改settings.py文件。
修改如下:
python
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
3.2 创建管理员
python
python manage.py createsuperuser
创建完之后,可以登录进入网页插入几条数据:

3.3 注册模型类
在应用下的admin.py文件中进行注册,告诉djang框架根据注册的模型类来生成对应表管理页面。
代码如下:
python
from django.contrib import admin
from .models import BookInfo,HeroInfo
admin.site.register(BookInfo)
admin.site.register(HeroInfo)
得到的界面如下:

3.4 自定义管理页面
代码如下:
python
from django.contrib import admin
from .models import BookInfo,HeroInfo
class BookInfoAdmin(admin.ModelAdmin):
list_display = ['id','title','publist_date']
class HeroInfoAdmin(admin.ModelAdmin):
list_display = ['id','name','gender','comment']
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)
得到的管理界面如下:
4.视图
在Django中,通过浏览器去请求一个页面时,使用视图函数来处理这个请求的,视图函数处理之后,要给浏览器返回页面内容。
4.1 定义视图函数
视图函数定义在views.py中。
代码如下:
python
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('你好啊')
视图函数必须有一个参数request,进行处理之后,需要返回一个HttpResponse的类对象,hello python就是返回给浏览器显示的内容。
4.2 url的配置

url配置的目的是让建立url和视图函数的对应关系。url配置项定义在urlpatterns的列表中,每一个配置项都调用url函数。
url函数有两个参数,第一个参数是一个正则表达式,第二个是对应的处理动作。
配置url时,有两种语法格式:
a) url(正则表达式,视图函数名)
b) url(正则表达式,include(应用中的urls文件))
工作中在配置url时,首先在项目的urls.py文件中添加配置项时,并不写具体的url和视图函数之间的对应关系,而是包含具体应用的urls.py文件,在应用的urls.py文件中写url和视图函数的对应关系。
在项目的urls.py文件的代码如下:
python
from django.contrib import admin
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^',include('booktest.urls')),
]
在应用的urls.py文件的代码如下:
python
from django.conf.urls import url,include
from . import views
urlpatterns = [
url(r'^index', views.index),
]
网页得到的结果如下:

4.3 url的配置过程
在项目 的urls.py文件中包含具体应用 的urls.py文件,应用的urls.py文件中写url和视图函数的对应关系。

当用户输入如http://127.0.0.1:8000/aindex时,去除域名和最前面的/,剩下aindex,拿aindex字符串到项目的urls文件中进行匹配,配置成功之后,去除匹配的a字符,那剩下的index字符串继续到应用的urls文件中进行正则匹配,匹配成功之后执行视图函数index,index视图函数返回内容hello python给浏览器来显示。
5.模板
5.1 模板文件的使用
1、创建模板文件夹
2、配置模板目录

3、定义模板
打开templtes/booktest/index.html文件,定义代码如下:
html
<html>
<head>
<title>图书列表</title>
</head>
<body>
<h1>{{title}}</h1>
{%for i in list%}
{{i}}<br>
{%endfor%}
</body>
</html>
在模板中输出变量语法如下,变量可能是从视图中传递过来的,也可能是在模板中定义的。
html
{{变量名}}
5.2 视图调用模板
调用模板分为三步骤:
- 1.找到模板
- 2.定义上下文
- 3.渲染模板
打开booktst/views.py文件,调用上面定义的模板文件
python
from django.http import HttpResponse
from django.template import loader,RequestContext
def index(request):
# 1.获取模板
template=loader.get_template('booktest/index.html')
# 2.定义上下文
context=RequestContext(request,{'title':'图书列表','list':range(10)})
# 3.渲染模板
return HttpResponse(template.render(context))
视图调用模板简写
视图调用模板都要执行以上三部分,于是Django提供了一个函数render封装了以上代码。 方法render包含3个参数:
- 第一个参数为request对象
- 第二个参数为模板文件路径
- 第三个参数为字典,表示向模板中传递的上下文数据
打开booktst/views.py文件,调用render的代码如下:
python
from django.shortcuts import render
def index(request):
context={'title':'图书列表','list':range(10)}
return render(request,'booktest/index.html',context)
5.3 给模板文件传递数据
模板变量使用:{{ 模板变量名 }}
模板代码段:{%代码段%}
for循环:
{% for i in list %}
list不为空时执行的逻辑
{% empty %}
list为空时执行的逻辑
{% endfor %}
6.完成项目
现在还需要的代码包括三个方面,三个方面顺序不分先后。
- 1.定义视图
- 2.定义URLconf
- 3.定义模板
6.1 定义视图
python
from django.shortcuts import render
from django.http import HttpResponse
from .models import BookInfo,HeroInfo
# Create your views here.
def books(request):
# 查询所有图书
books=BookInfo.objects.all()
# 将图书列表传递到模板中,然后渲染模板
return render(request,'books.html',{'books':books})
def hero(request,bid):
# 根据图书编号对应图书
book=BookInfo.objects.get(id=bid)
# 查找book图书中的所有英雄信息
heros=book.heroinfo_set.all()
return render(request,'detail.html',{'book':book,'heros':heros})
6.2 定义URLconf
编写test1/urls.py文件如下:
python
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^',include('booktest.urls')),
]
编写booktest/urls.py文件如下:
python
from django.conf.urls import url,include
from . import views
urlpatterns = [
url(r'^books$', views.books),
#配置详细页url,\d+表示多个数字,小括号用于取值,
url(r'^books/(\d+)$',views.hero),
]
6.3 定义模板
编写templates/books.html文件如下:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>图书信息如下:</h1>
<ul>
{% for book in books %}
<li><a href="books/{{book.id}}">{{book.title}}</a></li>
{% endfor %}
</ul>
</body>
</html>
编写templates/detail.html文件如下:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{book.title}}</h1>
英雄信息如下:
<ul>
{% for hero in heros %}
<li>{{hero.name}}--{{hero.comment}}</li>
{% empty %}
<li>没有英雄信息</li>
{% endfor %}
</ul>
</body>
</html>
结果:

