基础

创建项目

  • 创建Django项目
1
django-admin startproject <mysite>
  • 创建app
1
python manage.py startapp app01
  • 注册app
    • 在项目文件夹下,修改settings.py,在INSTALLED_APPS中添加刚刚创建的app,如app01.apps.App01Config(文件名,name,类名)
1
2
3
4
5
6
7
8
9
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
  • 使用已存在的数据库
1
python manage.py inspectdb > models.py

运行项目

运行项目

1
python manage.py runserver

切换端口

1
python manage.py runserver 8080

对外网开放

1
python manage.py runserver 0.0.0.0:8000

文件须知

settings.py

  • 注册app:INSTALLED_APPS
  • 使用app文件夹下的templates文件夹下的html:删除TEMPLATES下面的DIRS列表
  • DATABASES:配置需要的数据库
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
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'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',
],
},
},
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'datavisualization',
'USER': 'root',
'PASSWORD': 'root1234',
'HOST': '',
'PORT': '',
}
}

urls.py

编写url与视图函数的对应关系

在项目文件夹下,修改url.py

1
2
3
4
5
6
urlpatterns = [
# path('admin/', admin.site.urls),
# localhost:8000/app01/index 进入此路由,就会执行views.py中的index函数
path('index/', views.index),
path('getPage/', views.getPage),
]

views.py

  1. 默认会去当前app目录下寻找templates文件夹的test.html
  2. 可以通过字典的方式传递参数,html中通过两个大括号获取
    1. 如果参数是一个列表,可以通过列表点的方式获取列表中的某个元素,具体在下面有提及
  3. 获取请求
    1. request.GET
      1. 在url上传值:/something/?x=123&y=321
    2. request.POST
      1. 在请求体中提交数据
      2. 登录form表单中需要添加 大括号% csrf_token %大括号
  4. 函数返回
    1. HttpResponse:内容字符串返回给请求者
    2. render:返回HTML+渲染,最后也是返回字符串给浏览器
    3. redirect:让浏览器重定向到其他地址
1
2
3
4
5
6
7
8
9
from django.shortcuts import render, HttpResponse

# 默认需要有request参数
def index(request):
return HttpResponse('Hello World!')

def getPage(request):
name='Kyobo'
return render(request, 'test.html', {'name': name})

models.py

  • 创建数据库中的表结构
    • verbose_name为注解
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
from django.db import models

class UserInfo(models.Model):
username = models.CharField(verbose_name='用户名',max_length=32)
password = models.CharField(verbose_name='密码',max_length=32)
email = models.CharField(verbose_name='邮箱',max_length=32)
phone = models.CharField(verbose_name='电话号码',max_length=32)
avatar = models.CharField(verbose_name='头像',max_length=32)
create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
update_time = models.DateTimeField(verbose_name='更新时间',auto_now=True)
gender_choice = (
(1, '男'),
(2, '女'),
(3, '保密'),
)
gender = models.IntegerField(verbose_name='性别',choices=gender_choice)

# 若部门表被删除,那么与之关联的员工表中的部门字段,也会被删除(级联删除): models.CASCADE
# to='Department',指定与之关联的表
# to_field='id',指定与之关联的表中的字段
# 生成的depart_id字段,是Department表中的id字段(不能取非外表id字段的值)
depart = models.ForeignKey(verbose_name='部门',to='Department',to_field='id',on_delete=models.CASCADE)
# 若部门表被删除,那么与之关联的员工表中的部门字段,会被设置为null(级联删除): models.SET_NULL
# depart = models.ForeignKey(verbose_name='部门',to='Department',to_field='id',on_delete=models.SET_NULL,null=True,blank=True)

def __str__(self):
return self.username


def Department(models.Model):
title = models.CharField(verbose_name='部门名称',max_length=32)
create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True)
update_time = models.DateTimeField(verbose_name='更新时间',auto_now=True)

def __str__(self):
return self.title


静态文件

  • 在当前app文件夹下创建static文件夹,css,js,img,plugins都放置于此

  • 在当前app文件夹下创建templates文件夹,html文件放置于此

    • 第一行为Django语法,加载static文件夹,里面所有的路径都可以使用该语法
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
{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>This is a HTML</div>

<h1>{{name}}</h1>
<div>
{% for i in mylist %}
<div>{{i}}</div>
{% endfor %}
</div>
<ul>
{% for k,v in mydict.items %}
<li>{{k}} : {{v}}</li>
{% endfor %}
</ul>
<script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.js' %}"></script>
<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
</body>
</html>

ORM

连接数据库

  • 在settings.py中配置
1
2
3
4
5
6
7
8
9
10
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'datavisualization',
'USER': 'root',
'PASSWORD': 'root1234',
'HOST': '',
'PORT': '',
}
}

创建表

  • 在当前app文件夹下的models.py中添加类,即为创建表结构
  • ORM会自动创建表,表名为app01_userinfo(当前app名字+类名小写),里面的字段名为类中的属性名
  • 已创建的表需要新增列的话,需要给定一个默认值,删除列直接删即可(若新列为空,null=True, blank=True)
1
2
3
4
5
6
7
8
9
10
11
12
13
from django.db import models

class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=32)
email = models.CharField(max_length=32)
phone = models.CharField(max_length=32)
avatar = models.CharField(max_length=32)
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)

def __str__(self):
return self.username
  • 执行命令生成表
    • 当前app需要再settings.py中注册
1
2
python manage.py makemigrations
python manage.py migrate

操作表

  • 相当于insert语句,需要from app01.models import UserInfo(引入对应的类/表)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 增加数据
UserInfo.objects.create(name='Kyobo',password='123',email='12@qq.com',phone='1234567',avatar='123.jpg')

# 删除数据
UserInfo.objects.filter(id=1).delete()
UserInfo.objects.all().delete()

# 获取数据,返回的是列表,元素是对象
datalist=UserInfo.objects.all()
datalist=UserInfo.objects.filter(id=1)
object=UserInfo.objects.filter(id=1).first()
print(datalist[0].name)

# 修改数据
UserInfo.objects.filter(id=1).update(name='nrb')

跨域

  • 安装依赖包

pip install django-cors-headers

  • 在settings.py文件中更改相应的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# settings.py
INSTALLED_APPS = [
...
# demo
'corsheaders',
...
]

MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware', # 需注意与其他中间件顺序,这里放在最前面即可
...
]

# 支持跨域配置开始
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
  • 加载前端打包的项目
  • settings.py(根目录下)
1
2
3
4
5
6
7
8
9
10
11
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'dist')], # demo add
...
},
]
...
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'dist/static'),
]
  • urls.py(根目录下)
1
2
3
4
5
6
from django.views.generic.base import TemplateView

urlpatterns = [
...
path('', TemplateView.as_view(template_name='index.html'))
]

附录

  • 通过python manage.py inspectdb > models.py生成的文件替换app中的models.py,执行命令python manage.py makemigrations出现报错:ValueError: source code string cannot contain null bytes
    • 解决:
    • 生成的py文件默认是utf-16编码的,将编码方式换成utf-8,重新迁移即可
    • python manage.py makemigrations
      python manage.py migrate