models定义的变量类型

AutoField:一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中

BooleanField:true/false 字段,此字段的默认表单控制是CheckboxInput

NullBooleanField:支持null、true、false三种值

CharField(max_length=字符长度):字符串,默认的表单样式是 TextInput

TextField:大文本字段,一般超过4000使用,默认的表单控件是Textarea

IntegerField:整数

FloatField:用Python的float实例来表示的浮点数

DateField[auto_now=False, auto_now_add=False]):

参数DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false

参数DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false该字段默认对应的表单控件是一个TextInput.

在管理员站点添加了一个JavaScript写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的invalid_date错误消息键auto_now_add,auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果

案例:

1
2
3
4
5
6
7
8
9
10
11
12
#在models.py加入以下
# 定义 stu模型 类 home_stu
class Stu(models.Model):
sid = models.AutoField(primary_key=True)
name = models.CharField(max_length=50)
age = models.IntegerField(default=20)
email = models.CharField(max_length=100,null=True)

# 元选项
class Meta():
# 指定表名
db_table = 'stus'

对数据的增删改查

在home/urls.py里添加增删改查的路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 用户数据的管理
# 显示添加的表单
re_path(r'stu/add/$',views.stu_add,name="stu_add"),

# 执行用户数据的添加
re_path(r'stu/insert/$',views.stu_insert,name="stu_insert"),

# 显示用户的列表数据
re_path(r'stu/index/$',views.stu_index,name="stu_index"),

# 执行用户数据的删除
re_path(r'stu/del/$',views.stu_del,name="stu_del"),

# 用户数据的编辑
re_path(r'stu/edit/$',views.stu_edit,name="stu_edit"),

# 执行用户数据的更新
re_path(r'stu/update/$',views.stu_update,name="stu_update"),

设置初始页面,即表单页面

在template下新建stu目录下的add.html,添加表单的代码

1
2
3
4
5
6
7
8
9
10
11
12
<body>
<form action="{% url 'stu_insert' %}" method="POST">
{% csrf_token %}
用户名: <input type="text" name="name"><br>
邮箱: <input type="text" name="email"><br>
年龄: <input type="text" name="age"><br>
<button>添加</button>
</form>
</body>

#表单的提交使用post方法时需在首个form标签后加入{% csrf_token %}
#当提交的方法使用get时,则不需要任何操作

表单的提交,即添加的过程及结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 执行用户的添加
def stu_insert(request):
# 接收用户发送的表单数据
data = request.POST.dict()
data.pop('csrfmiddlewaretoken')
# {'name': 'aaa', 'email': 'aa@qq.com', 'age': '22'}

# 添加到数据库
obj = models.Stu(**data)
# 调用save方法进行保存
obj.save()

# 跳转到列表页
return HttpResponse('<script>alert("添加完成");location.href="/stu/index/";</script>')

设置表单提交完成后跳转的页面,首先设置子路由路径(见本标题第一行)和视图函数

1
2
3
4
5
6
7
8
# 用户数据管理  用户列表
def stu_index(request):
# 调用模型,获取用户数据
data = models.Stu.objects.all()
# 分配数据
context = {'userlist':data}
# 加载模板,返回数据
return render(request,'stu/index.html',context)

编写跳转页面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<center>
<table border="1" width="500">
<tr>
<td>ID</td>
<td>用户名</td>
<td>邮箱</td>
<td>年龄</td>
<td>操作</td>
</tr>
{% for v in userlist %}
<tr>
<td>{{ v.sid }}</td>
<td>{{ v.name }}</td>
<td>{{ v.email }}</td>
<td>{{ v.age }}</td>
<td>
<a href="{% url 'stu_del' %}?uid={{ v.sid }}">删除</a>
|
<a href="{% url 'stu_edit' %}?uid={{ v.sid }}">编辑</a>
</td>
</tr>
{% endfor %}
</table>
</center>

执行td标签的删除,首先设置子路由路径(见本标题第一行)和视图函数

1
2
3
4
5
6
7
8
9
10
# 执行用户的删除
def stu_del(request):
# 接收 id 参数
uid = request.GET.get('uid')
# 获取用户对象
ob = models.Stu.objects.get(sid=uid)
# 执行删除
ob.delete()
# 跳转到列表页
return HttpResponse('<script>alert("删除完成");location.href="/stu/index/";</script>')

执行td标签的编辑,首先设置子路由路径(见本标题第一行)和视图函数

1
2
3
4
5
6
7
8
9
10
# 用户数据的编辑
def stu_edit(request):
# 获取用户id
uid = request.GET.get('uid')
# 根据id获取用户对象
ob = models.Stu.objects.get(sid=uid)
# 把用户数据显示到编辑的表单中
context = {'uinfo':ob}
# 加载模板
return render(request,'stu/edit.html',context)

编写编辑页面的代码

1
2
3
4
5
6
7
<form action="{% url 'stu_update' %}?uid={{ uinfo.sid }}" method="POST">
{% csrf_token %}
用户名: <input type="text" name="name" value="{{ uinfo.name }}"><br>
邮箱: <input type="text" name="email" value="{{ uinfo.email }}"><br>
年龄: <input type="text" name="age" value="{{ uinfo.age }}"><br>
<button>更新</button>
</form>

编辑页面提交完成后,更新数据库里数据,首先设置子路由路径(见本标题第一行)和form表单提交的视图函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 执行用户数据的更新
def stu_update(request):
# 接收表单数据
data = request.POST.dict()
data.pop('csrfmiddlewaretoken')
# 接收id
uid = request.GET.get('uid')
# 根据id获取对象
ob = models.Stu.objects.get(sid=uid)
# 修改对象的属性
ob.name = request.POST.get('name')
ob.email = request.POST.get('email')
ob.age = request.POST.get('age')
# 执行修改
ob.save()
# 跳转
return HttpResponse('<script>alert("更新完成");location.href="/stu/index";</script>')

url 统一资源定位符

http://127.0.0. 1:8000/user/abc/?a=1&b=2
协议: http https file svn ...
ip或域名:  127.0.0. 1  www.itxdl.cn
端口:  80 443 8000 5000 8080....
路径: /user/abc/
参数:?a=1&b=2

模型的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
查询
#获取当前模型中所有的对象数据 结果 查询集
obs = models.Stu.objects.all()
#根据id获取当前对象 结果 对象 注意:get方法能且只能返回一个对象
ob = models.Stu.objects.get(id=1)

添加
第一种 方法
data = {'name':'admin','age':20}
ob = models.Stu(**data)
ob.save()
第二种
ob = models.Stu()
ob.name = 'zhangsan'
ob.age = 20
ob.save()

删除
获取对象.执行删除
ob.delete()

更新
ob.name = 'aabb'
ob.save()

用户管理

先定义一个视图函数 显示添加表单,

表单把数据提交到 执行数据添加的函数中,

完成后跳转到 用户列表的视图函数中

删除链接提交到 一个执行用户删除的视图函数中,完成后跳转到 列表页

编辑链接提交到 一个显示用户数据的修改表单中

修改表单把数据 提交到执行数据更新的视图函数中