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
|
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')
obj = models.Stu(**data) 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): 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): uid = request.GET.get('uid') 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') uid = request.GET.get('uid') 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() 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()
|
用户管理
先定义一个视图函数 显示添加表单,
表单把数据提交到 执行数据添加的函数中,
完成后跳转到 用户列表的视图函数中
删除链接提交到 一个执行用户删除的视图函数中,完成后跳转到 列表页
编辑链接提交到 一个显示用户数据的修改表单中
修改表单把数据 提交到执行数据更新的视图函数中