【Django】基础学习笔记

初识模板

从数据库获取值动态渲染到页面上

↓ 固定的data文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- user_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ message }}</h1>
<ul>
{% for item in data_list %}
<li>{{ item }}</li>
{% endfor%}
</ul>
</body>
</html>
1
2
3
4
5
6
7
8
# views.py
def user list(request):
#1.数据库获取所有的用户列表
data =["武沛齐", "李立权", "张弛"]

# 2.打开文件并读取内容
# 3.模板的渲染 -> 文本替换
return render(request,"user list.html",{"message":"标题来了""data_list": data})

↓ 想展示列表里某一个单独的值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- user_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 获取列表中单独某一项 -->
<a>{{ data_list.0 }}</a>
<a>{{ data_list.1 }}</a>
<a>{{ data_list.2 }}</a>
</body>
</html>

↓ 在模板中显示字典信息

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
<!-- "xx": mapping,所以字典变量在这里面只能叫xx -->
<!-- user_list.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!-- 获取字典全部值 -->
<p>{{ xx }}</p> <!-- {"name": "名字", "age": 19, "size": 18} -->


<!-- 获取字典中某项值 -->
<p>{{ xx.name }}</p>
<p>{{ xx.age }}</p>
<p>{{ xx.size }}</p>

<!-- 给字典加循环 -->
<ul>
<!-- 以字典键作为循环 -->
{% for item in xx.keys %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</hr>
<ul>
<!-- 以字典值作为循环 -->
{% for item in xx.values %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</hr>
<ul>
<!-- 以字典键值对作为循环 -->
{% for k,v in xx.items %}
<li>{{ k }} {{ v }}</li>
{% endfor %}
</ul>

</body>
</html>
1
2
3
4
5
6
7
8
9
10
# views.py
def user list(request):
#1.数据库获取所有的用户列表
data =["武沛齐", "李立权", "张弛"]

mapping = {"name": "名字", "age": 19, "size": 18}

# 2.打开文件并读取内容
# 3.模板的渲染 -> 文本替换
return render(request,"user list.html",{"message":"标题来了""data_list": data, "xx": mapping})

9. 案例-号码列表

1
2
3
4
5
6
7
8
9
10
11
12
# views.py
def phone_list(request):
# 1. 获取数据
queryset = [
{"id":1,'phone':"1888888888""city":"上海"}
{"id":2,'phone':"1888888882""city":"北京"}
{"id":3,'phone':"1888888883""city":"上海"},
{"id":4'phone':"1888888884""city":"上海"}
]

# 2. 通过页面渲染返回给用户(表格形式展现)
return render(request, 'phone_list.html', {"data": queryset})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--phone_list.html-->
<!-- 写死数据 -->
<body>
<h1>号码列表</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>手机号</th>
<th>归属地</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>19888</td>
<td>上海</td>
</tr>
</tbody>
</table>
</body>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- 用循环处理获取的数据 -->
<body>
<h1>号码列表</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>手机号</th>
<th>归属地</th>
</tr>
</thead>
<tbody>
{% for row in data %}
<tr>{{ row.id }}</tr>
<tr>{{ row.phone }}</tr>
<tr>{{ row.city }}</tr>
{% endfor %}
</tbody>
</table>
</body>

10. Django中静态文件处理&bootstrap引入

图片、css、js等

在当前应用的目录下创建一个static文件夹,放置静态文件

也可以在根目录创建static,django一般会默认先去根目录找,找不到了再根据settings.py中installed_app里面的应用目录去找

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
<!-- 项目中引入静态文件 -->
<!D0CTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.4.1/css/bootstrap.min.css"></head>
<body>
<div class="container">
<h1>号码列表</h1>
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>手机号</th>
<th>归属地</th>
</tr>
</thead>
<tbody>
{% for row in data %}
<tr>{{ row.id }}</tr>
<tr>{{ row.phone }}</tr>
<tr>{{ row.city }}</tr>
{% endfor %}
</tbody>
</table>


<script src="/static/jquery-3.6.0.min.js"></script>
<script src="/static/bootstrap-3.4.1/js/bootstrap.min.js"></script>
</div>
</body>
</html>

11. 静态文件正确引入

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
<!-- ↓静态文件的统一导入写法 -->
{% load static %} <!-- Django中的语法,导入一个模块 -->
<!D0CTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 这样设置完,Django根据settings.py中的STATIC_URL,会去项目目录下自动读取 -->
<!-- 读取到之后放在下面的链接前面自动拼接 -->
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1/css/bootstrap.min.css' %}"></head>

<body>
<div class="container">
<h1>号码列表</h1>
<table class="table table-bordered">
<thead>
<tr>
<th>ID</th>
<th>手机号</th>
<th>归属地</th>
</tr>
</thead>
<tbody>
{% for row in data %}
<tr>{{ row.id }}</tr>
<tr>{{ row.phone }}</tr>
<tr>{{ row.city }}</tr>
{% endfor %}
</tbody>
</table>


<script src="/static/jquery-3.6.0.min.js"></script>
<script src="/static/bootstrap-3.4.1/js/bootstrap.min.js"></script>
</div>
</body>
</html>

12. 登录&跳转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- login.html -->
<!-- 以POST形式提交后台 -->
<body>
<div class="login-box">
<h2>用户登录</h2>
<form method="post" action="/login/">
<div class="form-group">
<label>用户名</label>
<input type="text" class="form-control" placeholder="请输入用户名" name="user">
</div>

<div class="form-group">
<label>密码</label>
<input type="password" class="form-control" placeholder="请输入密码" name="pwd">
</div>

<button type="submit" class="btn btn-primary">提 交</button>

<!-- 存放登录失败时显示的报错信息 -->
<span style="color: red;">{{ error }}</span>
</form>
</div>
</body>
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
from django.shortcuts import render, redirect

def login(request):
# 判断到底是POST还是GET请求
if request.method == "GET":
return render(request, 'login.html')
else: # 即发送的是POST请求
# 去请求体中获取数据,再进行校验{user:...,pwd:...}
username = request.POST.get('user')
password = request.POST.get('pwd')

# 去数据库中校验用户名和密码是否存在以及匹配
# 成功,跳转到后台管理界面http://127.0.0.1:8000/index/ 如果是本地环境也可以简写成/index/
# return redirect('/index/')
# 不成功,再次让用户看到 login.html 界面 -> 用户名或密码错误
# return render(request, "login.html", {"error": "用户名或密码错误"})

if username == 'root' and password == 'root':
return redirect('/index/')
else:
return render(request, "login.html", {"error": "用户名或密码错误"})


def index(request):
return render(request, "index.html")

使用以上代码后,账密正确但仍显示403 Forbidden

原因:Django框架的特性:Csrf Token验证

方法1:把settings.py中的middleware的csrf注释掉

​ 方法2:在表单页面写上{% csrf_token %}

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
<!-- login.html -->
<!-- 以POST形式提交后台 -->
<body>
<div class="login-box">
<h2>用户登录</h2>
<form method="post" action="/login/">
<!-- 在表单页面写上以下内容 -->
{% csrf_token %}

<div class="form-group">
<label>用户名</label>
<input type="text" class="form-control" placeholder="请输入用户名" name="user">
</div>

<div class="form-group">
<label>密码</label>
<input type="password" class="form-control" placeholder="请输入密码" name="pwd">
</div>

<button type="submit" class="btn btn-primary">提 交</button>

<!-- 存放登录失败时显示的报错信息 -->
<span style="color: red;">{{ error }}</span>
</form>
</div>
</body>

这样在表单提交时,会生成一个隐藏的csrf_token字符串,供Django校验是否是发送给该框架的请求

13. 案例-后台管理

导航栏

image-20241229165052963

需要在下面引入JQuery和bootstrap

1
2
<script src="/static/jquery-3.6.0.min.js"></script>
<script src="/static/bootstrap-3.4.1/js/bootstrap.min.js"></script>
1
2
3
4
5
6
7
8
9
10
11
12
# 跳转到index.html界面,index视图函数获取数据并渲染展示
def index(request):
# 1. 数据库获取数据
queryset = [
{"id":1,'phone':"1888888888""city":"上海"}
{"id":2,'phone':"1888888882""city":"北京"}
{"id":3,'phone':"1888888883""city":"上海"},
{"id":4'phone':"1888888884""city":"上海"}
]

# 2. 通过页面渲染返回给用户(表格形式展现)
return render(request, 'index.html')

14. Django的ORM操作-表结构

ORM,对象关系映射

在数据库里有一张表,在django中可以有一个类与之对应

1
2
3
4
5
class UserInfo:
id = IntegerField
name = CharField
age = IntegerField
email = CharField

表示数据:用类的对象

1
2
3
4
5
# 把数据类实例化
obj1 = UserInfo(id=x, name=x, age=x, email=x)
obj2 = UserInfo(id=x, name=x, age=x, email=x)
obj3 = UserInfo(id=x, name=x, age=x, email=x)
obj4 = UserInfo(id=x, name=x, age=x, email=x)

ORM 出现的目的:便于开发,便于项目中对数据库进行操作

  • 创建表结构 & 修改表结构
  • 操作表中的数据
  • ORM 不能直接创建数据库

14.1 自己创建数据库

在navicat下创建本地数据库

14.2 用 ORM 创建表

在app下的models.py中创建指定的类和命令,Django会自动创建表

1
2
3
4
5
6
7
8
from django.db import models

class UserInfo(models.Model):
# id = models.AutoField() # AutoField是一个自增的类型 创建了model类之后Django会自动帮助生成一个自增的id主键
name = models.CharField(verbose_name="姓名", max_length=16) # varchar
pwd = models.CharField(verbose_name="密码", max_length=64) # varchar
age = models.IntegerField(verbose_name="年龄") # int
email = models.CharField(verbose_name="邮箱", max_length=32) # varchar

14.3 命令

先连接数据库

​ 在settings.py中找到DATABASES,修改数据库相关信息

修改数据库相关信息

python代码连接数据库使用的:pymysql

django内部使用的:mysqlclient

1
pip install mysqlclient

使用到Django项目的管理工具:manage.py

1
2
python manage.py makemigrations
python manage,py migrate
  • makemigrations,读取已注册的所有app中的models.py文件,根据类生成配置文件并放到app下的migrations目录
    • 已注册:看settings.py中的INSTALLED_APPS
  • migrate,根据配置文件migrations自动生成相应的SQL语句
1
2
3
4
5
6
create table demo_userinfo(
id int ...,
name ...,
age ...,
email ...
)

默认创建的表名格式:nameOfApp_nameOfTable

app的名字+表名

15 ORM-数据操作

1
2
3
4
5
6
7
8
from django.db import models

class UserInfo(models.Model):
# id = models.AutoField() # AutoField是一个自增的类型 创建了model类之后Django会自动帮助生成一个自增的id主键
name = models.CharField(verbose_name="姓名", max_length=16) # varchar
pwd = models.CharField(verbose_name="密码", max_length=64) # varchar
age = models.IntegerField(verbose_name="年龄") # int
email = models.CharField(verbose_name="邮箱", max_length=32) # varchar
  • 新增
1
2
3
4
5
6
# 新增数据的方法1
models.UserInfo.create(name="aa",pwd="123",age=19,email='xxx@live.com')


# 新增数据的方法2,以字典的形式,字典的{前面需要加**
models.UserInfo.create(**{"name":"aa","pwd":"123","age":19,email:"xxx@live.com"})
  • 查询
1
2
3
4
5
6
7
8
9
10
11
12
# 查询条件:name=aa 并且 age=19,查询得到一个结果存入v1变量

# 查询结果是一个queryset,queryset = [ obj, obj, obj ],每个对象obj里面包含id、name、pwd等字段信息 没查到就返回空列表[]
v1 = models.UserInfo.objects.filter(name="aa",age=19)

# queryset=[ obj, obj, obj ] 以下语句查询到了所有数据 没查到就返回空列表[]
v2 = models.UserInfo.objects.all()


# 由于执行了一个.first(),所以查询结果不会拿到一个列表,而是一个对象obj,即第一条对象
v3 = models.UserInfo.objects.filter(name="aa",age=19).first()
# 注意:未查询到数据时返回的都是None
  • 删除:搜索到之后再删
1
2
3
4
5
# 全部删除
models.UserInfo.objects.all().delete()

# 查询匹配到了之后再删除
models.UserInfo.objects.filter(name="aa", age=19).delete()
  • 修改:搜索到之后再修改
1
2
3
4
5
# 修改全部数据
models.UserInfo.objects.all().update(age=19)

# 查询匹配到了之后再修改
models.UserInfo.objects.filter(id=10).update(age=20)

18 ORM案例:数据库操作

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
# views.py
from django.shortcuts import render, HttpResponse
from app1 import models

# 以下实现数据库最简单的增删改查
def depart(request):
# ORM操作
# 新增(第一种写法)
models.Department.objects.create(title="销售部", count=10)
# 使用方法:url/depart/ 页面显示执行成功,再看数据库已有新增数据
# 新增(第二种写法)
models.Department.objects.create(**{"title":"销售部", "count":10})


# 查询
# 查询所有数据
queryset = models.Department.objects.all()
print(queryset)
for obj in queryset:
print(obj.id, obj.title, obj.count) # 打印列表项的其中部分字段

# 查询部分数据(有条件过滤)
queryset2 = models.Department.objects.filter(id__gt=0) # id>0
for obj in queryset2:
print(obj.id, obj.title, obj.count) # 打印列表项的其中部分字段

# 查询并获取单个数据对象
obj2 = models.Department.objects.filter(id=1).first()
print(obj2.id, obj2.title, obj2.count)


# 删除(查询的到就能删)
models.Department.objects.filter(id=1).delete() # 删除了id为1的数据


# 更新(查询的到就能更新)
models.Department.objects.filter(id=2).update(count=20)

return HttpResponse("执行成功")

1
2
3
4
5
6
7
8
9
# urls.py
from django.contrib import admin
from django.urls import path
from app01 import views

ulrpatterns = [
path('admin/', admin.site.urls)
path('depart/', views.depart)
]

19. 案例:部门列表

1
2
3
4
5
6
7
8
9
10
11
12
# views.py
from django.shortcuts import render, HttpResponse
from app1 import models

# 以下实现数据库最简单的增删改查
def depart(request):
# queryset = [ obj, obj, obj ]
# queryset = models.Department.objects.all() # 获取当前数据表的所有数据(排序默认asc)
queryset = models.Department.objects.all().order_by("-id") # desc

# return HttpResponse("执行成功") # 这是写死的值,把这个值换成从数据库获取的
return render(request, 'depart.html', {'queryset': queryset})
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
<!-- depart.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<table>
<thead>
<tr>
<th>ID</th>
<th>部门</th>
<th>人数</th>
</tr>
</thead>
<tbody>
{% for item in queryset %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.title }}</td>
<td>{{ row.count }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>

20. 案例-添加部门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# views.py
from django.shortcuts import render, HttpResponse, redirect
from app1 import models

def add_depart(request):
""" 添加部门 """

# 显示添加部门的页面
if request.method == "GET":
return render(request, 'add_depart.html')
# 提交部门信息,新建
title = request.POST.get("title")
count = request.POST.get("count")
models.Department.objects.create(title=title, count=count)

# 跳转回列表页面
return redirect("/depart/")
1
2
3
4
5
6
7
8
9
10
# urls.py
from django.contrib import admin
from django.urls import path
from app01 import views

ulrpatterns = [
path('admin/', admin.site.urls)
path('depart/', views.depart)
path('add/depart/', views.add_depart),
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- add_depart.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>添加部门</h2>

<form method="post" action="/add/depart/">
{% csrf_token %}
<input type="text" placeholder="部门名称" name="title/">
<input type="text" placeholder="人数" name="count/">
<input type="submit" value="提交">
</form>
</body>
</html>

21. 案例:删除部门

1
2
3
4
5
6
7
8
9
10
11
# views.py
from django.shortcuts import render, HttpResponse, redirect
from app1 import models

def delete_depart(request):
""" 删除部门 """
# http://127.0.0.1:8080/delete/depart/?id=3
depart_id = request.GET.get('id')
models.Department.objects.filter(id=depart_id).delete()

return redirect("/depart/")
1
2
3
4
5
6
7
8
9
10
11
# urls.py
from django.contrib import admin
from django.urls import path
from app01 import views

ulrpatterns = [
path('admin/', admin.site.urls)
path('depart/', views.depart)
path('add/depart/', views.add_depart),
path('delete/depart/', views.delete_depart),
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- depart.html -->
<table>
<thead>
<tr>
<th>ID</th>
<th>部门</th>
<th>人数</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for item in queryset %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.title }}</td>
<td>{{ row.count }}</td>
<td>
<a href="/delete/depart/?id={{ row.id }}">删除</a>
<!-- 把要删除的记录的id传给url后面明文显示,根据id获取数据信息,再去数据库中删除 -->
</td>
</tr>
{% endfor %}
</tbody>
</table>

22. 案例:编辑部门

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# views.py
def edit_depart(request):
""" 编辑页面 """
# http://127.0.0.1:8000/edit/depart/?id=3


# 从列表页面跳转过来的时候
if request.method == "GET":
depart_id = request.GET.get('id') # id对应的这条数据要编辑
# 加上first(),得到一个对象
depart_object = models.Department.objects.filter(id=depart_id).first()
# 拿到对象之后传到前端,即修改界面
return render(request, 'edit_depart.html', {'depart_object':depart_object})

# 编辑并提交数据(以下操作在edit_depart.html界面)
depart_id = request.GET.get("id") # 根据id获取对应数据

x1 = request.POST.get("title")
x2 = request.POST.get("count")

models.Department.objects.filter(id=depart_id).update(title=x1,count=x2)

# 修改成功之后做重定向,把修改之后的数据显示出来
return redirect("/depart/")
1
2
3
4
5
6
7
8
9
10
11
12
# urls.py
from django.contrib import admin
from django.urls import path
from app01 import views

ulrpatterns = [
path('admin/', admin.site.urls)
path('depart/', views.depart)
path('add/depart/', views.add_depart),
path('delete/depart/', views.delete_depart),
path('edit/depart/', views.edit_depart)
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- depart.html -->
<table>
<thead>
<tr>
<th>ID</th>
<th>部门</th>
<th>人数</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for item in queryset %}
<tr>
<td>{{ row.id }}</td>
<td>{{ row.title }}</td>
<td>{{ row.count }}</td>
<td>
<a href="/edit/depart/?id={{ row.id }}">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- edit_depart.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>修改部门</h2>

<form method="post" action="/edit/depart/">
{% csrf_token %}
<input type="text" placeholder="部门名称" name="title/" value="{{ depart_object.title }}">
<input type="text" placeholder="人数" name="count/" value="{{ depart_object.count }}">
<!-- value代表默认值,符合实际生产环境的默认值就是当前数据修改前的原始值 -->
<input type="submit" value="提交">
</form>

<!-- 问题:修改页面中,需要显示原本修改之前的值作为参考 -->

</body>
</html>

23. 案例-集成 BootStrap 界面

  • 下载bootstrap.min.css和Jquery文件到根目录static目录下

在需要引入BootStrap样式的html文件中引入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="{% static
'bootstrap-3.4.1/css/bootstrap.min.css' %}">
</head>
<body>

</body>
</html>
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
<!-- add_depart.html -->
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="container">
<div class="panel panel-default">
<div class="panel-heading">Panel heading without title</div>
<div class="panel-body">
<h2>添加部门</h2>
<form class="form-inline" method="post" action="/add/depart/">
{% csrf_token %}
<div class="form-group">
<label class="sr-only">部门名称</label>
<input class="form-control" type="text" placeholder="部门名称" name="title/">
</div>
<div class="form-group">
<label class="sr-only">人数</label>
<input class="form-control" type="text" placeholder="人数" name="count/"> </div>
<button type="submit" class="btn btn-primary">保 存</button>
</form>
</div>
</div>
</div>

</body>
</html>
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
<!-- edit_depart.html -->
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="container" style="margin-top: 10px">
<div class="panel panel-default">
<div class="panel-heading">编辑部门信息</div>
<div class="panel-body">
<form class="form-inline" method="post" action="/edit/depart/?id={{ depart_object.id }}">
{% csrf_token %}
<div class="form-group">
<label class="sr-only">部门名称</label>
<input class="form-control" type="text" placeholder="部门名称" name="title" value="{{ depart_object.title }}" />
</div>
<div class="form-group">
<label class="sr-only">人数</label>
<input class="form-control" type="text" placeholder="人数" name="count" value="{{ depart_object.count }}" /> </div>
<button type="submit" class="btn btn-primary">保 存</button>
</form>
</div>
</div>
</div>

</body>
</html>

24 今日总结

  • Django 框架
1
pip install django==3
  • 创建项目
  • 配置
    • 注册APP
    • MySQL连接(数据库先创建)
  • 在 App 目录下的models.py中创建表结构
    • 写models
    • 命令:makemigration、migrate
  • 写功能代码
    • urls.py
    • views.py 【基于 ORM 对数据库中的表数据进行操作】
    • templates里面创建html
  • 静态文件配置(CSS、JS、图片)
    • 在根目录下的static目录
    • 把下载的bootstrap和jquery放到static
  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信