Django流程

创建项目

1
Django-admin startproject mysite

注意:路径中不要带有中文

层级目录说明

1

manage.py 一个命令行工具,可以让我们用多种方式对Django项目进行交互
__init__.py 一个空文件,它告诉Python这个目录应该被看做一个包
settings.py 项目的配置文件(主要处理文件)
urls.py 项目的url声明 (主要处理文件)
wsgi.py 项目与WSGI兼容的Web服务器入口

配置数据库(mysql)

在Django中,默认使用 SQLite数据库,在settings.py文件中通过DATABASES选项进行数据库配置。

配置mysql

1.在mysite/__init__.py中写入两行代码

1
2
import mysql
mysql.install_as_MySQLdb()

2.在settings.py中对DATABASES进行配置

1
2
3
4
5
6
7
8
9
10
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "my_site",
'USER': "root",
'PASSWORD': "m",
'HOST': "localhost",
'PORT': "3306"
}
}

创建应用

创建

创建应用–在一个项目中可以创建多个应用,每个应用进行一种业务处理在manage.py所在文件夹下打开cmd,输入命令

1
python manage.py startapp myapp

层级目录说明

2

admin.py 进行站点配置,用于注册模型等
models.py 创建模型
views.py 创建视图
test,py 网站测试
migration文件夹 于数据迁移

激活

在settings.py中,将myapo应用加入到INSTALLED.APPS选项中

1
2
3
4
5
6
7
8
9
10

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]

定义模型

定义

概述,有一个数据表就对应有一个模型。在models.py中定义模型。模型类要继承models.Model类。所以要import models这个类

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.db import models
class Classes(models.Model):
cname = models.CharField(max_length=20)
cdate = models.DateTimeField()
cgirlnum = models.IntegerField()
cboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)

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("Classes", on_delete=models.CASCADE,)

说明:不需要定义主键,在生成时自动添加,并且值为自动增加

迁移

1.生成迁移文件,执行:

1
python manage.py makemigrations

2.执行迁移,执行:

1
python manage.py migrate

测试数据操作

进入到python shell

1
python manage.py makemigrations

引入包

1
2
3
from myApp.models import Grades, Students
from django.utils import timezone
from datetime import *

查询所有数据

1
2
#类名.objects.all()
Student.objects.all()

添加数据

1
2
3
4
5
6
7
8
9
Classes1 = Classes()

Classes1.cname = "python"
Classes1.cdate = datetime(year=2017, month=7, day=17)
Classes1.cgirlnum = 3
Classes1.cboynum = 70

##保存
Classes1.save()

查看某个对象

1
2
3
4
#类名.objects.get(pk=1)   pk:primary key
Classes.objects.get(pk=1)
#类名.objects.all() 得到所有
Classes.objects.get(pk=1)

关联对象

需求获取班所以普学生

1
2
#关联的类名小写_set.all()
class.sutdents_set.all()

需求创建A,属于班

1
stu3=classes1.students_set.create(**values)

启动服务器

格式:python manage.py runserver ip:port

Admin站点管理

创建管理员用户

在manage.py文件所在目录执行

1
python manage.py createsuperuser

一次输入账号、邮箱、密码即可创建用户

登陆

登陆网站: http://localhost:8000/admin/

3

汉化

在settings.py中将LANGUAGE_CODE设置为’zh-Hans0’, TIME_ZONE=’Asia/Shanghai’

管理数据表

修改myapp\admin.py:

1
2
3
4
from django.contrib import admin
#register your models here
from .models import Classes, Students
admin

自定义管理页面

属性说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 列表页属性
list_display = [] # 显示字段设置
list_filter = [] # 过滤字段设置
search_fields = [] # 搜索字段设置
list_per_page = [] # 分页设置
# 添加,修改页属性
fields = [] # 规定属性的先后顺序
fieldsets = [] # 给属性分组 注意:fields与fieldsets不能同时使用
属性示例:
# 列表页属性
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"]}),
]
关联对象:需求:在创建一个班级时可以直接添加几个学生
class StudentsInfo(admin.TabularInline):# 可选参数admin.StackedInline
model = Students
extra = 2
class GradesAdmin(admin.ModelAdmin):
inlines = [StudentsInfo]
布尔值显示问题示例:
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return "男"
else:
return "女"
# 设置页面列的名称
gender.short_description = "性别"
list_display = ['pk', 'sname', 'sage', gender,
'scontend', 'sgrade', 'isDelete']
list_per_page = 10
admin.site.register(Students, StudentsAdmin)
执行按钮位置:
class StudentsAdmin(admin.ModelAdmin):
...snip...
actions_on_top = False
actions_on_bottom = True
admin.site.register(Students, StudentsAdmin)
使用装饰器完成注册:
@admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
...snip...
actions_on_top = False
actions_on_bottom = True

视图的基本使用

概述:

在Django中,视图是对web请求进行回应,视图就是一个python函数

流程:

1.网址:Django获取网址信息,去掉端口。

2.虚拟路径与文件名:url管理器逐个匹配urlconf,记录视图函数

3.函数视图名:视图管理,找到对应的视图去执行,返回结果给浏览器

4.相应的数据:返回第一步

重定向

错误视图

​ 404视图:找不到网页(url匹配不成功时返回)

自定义 404 page:

​ 1.修改project/settings.py

1
2
3
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ["*"]
  • 在ALLOWED_HOSTS中设置”*“将允许你在debug中为false时使用任何host婞项目,不要再生产中这样做
  • 设置DEBUG为Flase将会允许你的错误URL返回响应

​ 2.配置project/urls.py,添加上

1
2
from django.conf.urls import handler404
handler404 = 'myapp.views.error_404_view'

​ 3.自定义404错误页面

在/myapp/views.py中写入

1
2
3
def error_404_view(request, exception):
data = {"name": "ThePythonDjango.com"}
return render(request,'error_404.html', data)

​ 这样,当用户输入错误的url,我们将会返回project下,templates中的error_404.html页面了

接下来在project/templates文件夹中创建error_404.html

1
2
3
4
5
6
7
8
9
10
<html>
<head>
</head>
<body>
<h1> This is a custom 404 error page which will
be shown instead of default 404 error page of Django everytime
incorrect urls is entered in browser.
</h1>
</body>
</html>

urls配置

配置流程

1.定制根url配置文件

setting.py中默认实现了

1
ROOT_URLCONF = 'project.urls'

2.urlpatterns

在应用中创建urls.py

project/urls.py

1
2
3
4
5
6
7
8
9
from django.contrib import admin
from django.urls import path, include
from django.conf.urls import handler404, handler500
from myapp import urls
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('myapp.urls'))
]
handler404 = 'myapp.views.error_404_view'

project/myapp/urls.py

1
2
3
4
5
6
7
from django.contrib import admin
from django.urls import path, include
from . import views
urlpatterns = [
path('index', views.index),
path('<int:a>', views.number),
]
  1. url反响解析

    概述:如果在视图,模板中使用了硬编码链接,在url配置发生改变时,动态生成链接的地址
    解决:在使用链接时,通过url配置的名称,动态生成url地址
    作用:使用url模板

视图函数

参数

*  一个Httprequest实例(request),
*  从urls中传递过来的参数

HttpRequest 对象

概述:

1
2
3
4
>  服务器接收http请求后,会根据报文创建HttpRequest对象
> 视图的第一个参数就是HttpRequest对象
> django创建的,之后调用视图时传递给视图
>

属性

  • path:请求的完整路径(不包括域名和端口)
  • method:表示请求的方式,常用的有GET,POST
  • encoding:表示浏览器提交的数据的编码方式,一般为utf-8
  • GET:类似于字典的对象,包含了get请求的所有参数
  • POST:类似于字典的对象,包含了post请求的所有参数
  • FILES:类似字典的对象,包含了所有上传的文件
  • COOKIES:字典,包含所有的cookie
  • session:类似字典的对象,表示当前会话

方法和对象

  • is_ajax():如果是通过XMLHttpRequest发起的,返回 True