如何动态的展示我们的数据
1、先获取到数据库中的信息内容
def user_info(request):
userinfo_all = models.user_info.objects.all() # 获取所有的用户对象
# <QuerySet [<user_info: user_info object>, <user_info: user_info object>, <user_info: user_info object>, <user_info: user_info object>, <user_info: user_info object>]>
# 返回图书馆的管理页面
return render(request, 'user_info_table.html', locals()) # loclas 获得当前局部内的所有变量
"""得到这些用户对象我们就可以在前端使用for循环的方法遍历取出所有对象,然后再用对象.字段名得到每个用户的准确信息"""
2、动态展示数据内容
# 在展示页面利用for循环
动态展示数据库里面的信息
"""
<tbody>
{% for user in userinfo_all %} 使用for循环遍历出来这个对象,获取到详细的数据
<tr class="text-center">
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.password }}</td>
<td class="text-center">
<a href="/update_user/?user_id={{ user.id }}"
class="btn btn-success btn-xs">修改</a>
<a href="/delete/?user_id={{ user.id }}"
class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
"""
修改用户在表格中的数据
1、用户点击编辑按钮会跳转到修改用户信息页面,我们可以在前端写一个在返回页面的时候携带一些参数,比如说用户的ID
<a href="/update_user/?user_id={{ user.id }}"
2、在获取用户的ID
# 因为在发起请求的时候是GET请求,所以要使用GET的方式获取
user_id = request.GET.get("user_id")
# 根据用户的ID获取到用户的信息
alter = models.user_info.objects.filter(id=user_id).first()
"""注意:这里一定要加上first,要不然获得的是一个对象列表,而不是一个对象"""
user_info object # 有first
<QuerySet [<user_info: user_info object>]> # 没有first
# 判断请求方式
if request.method == 'POST':
# 获得用户修改的数据
hidden = request.POST.get("hidden_id")
username = request.POST.get("username")
password = request.POST.get("password")
# 将数据重新写入到数据库
models.user_info.objects.filter(id=hidden).update(name=username, password=password)
# 重新返回用户管理页面
return redirect('/user_info_table/')
# 通过id获得用户对象,然后将用户对象放到locale的里面
return render(request, 'update_user.html', locals())
Django中对数据的改、删、查
# 增加
方法一:
def register(request): # 数据库字段 = input框的name值
models.user_info.objects.create(name=username, password=password)
方法二:
obj = models.表名(类名)(usernam='',password='')
obj.save
# 删除数据
1、物理删除:
def delete(request):
user_id = request.GET.get("user_id")
models.User_info.objects.filter(pk=user_id).delete() # 删除一个主键id为user_id的信息
2、软删除:
软删除的意思是不直接从硬盘中删除数据,而是在表中添加一个is_delete的字段
它的用法就是,正常数据这个字段值为0,如果删除了就is_delete=1
"每次删除更新这个字段信息就行了"
id username password age gender is_delete
1 1 1 1 1 0
1 1 1 1 1 1
1 1 1 1 1 0
1 1 1 1 1 0
1 1 1 1 1 0
1 1 1 1 1 1
# 查询的时候怎么区分是正常数据还是已经被删除的数据?
models.表名(类名).objects.filter(is_delete=0).all()
# 修改用户数据
def update_user(request):
models.user_info.objects.filter(id=hidden).update(name=username, password=password)
# 修改id为hidden的信息
# 查看
# 方式一
def user_info(request):
userinfo_all = models.user_info.objects.all() # 获取所有的信息
# 方式二
def update_user(request):
# 获取用户的ID
user_id = request.GET.get("user_id")
# 通过ID筛选出用户的信息
alter = models.user_info.objects.filter(id=user_id).first() # 只获取id为user_id的对象
"""
易错点:如果后面不加first则会拿到个对象列表,而不是一个对象
"""
动态展示数据库里面的信息
"""
如何告诉后端用户想要编辑哪条数据?
将编辑按钮所在的那一行数据的主键值发送给后端
利用url问号后面携带参数的方式
<tbody>
{% for user in userinfo_all %} 使用for循环遍历出来这个对象,获取到详细的数据
<tr class="text-center">
<td>{{ user.id }}</td>
<td>{{ user.name }}</td>
<td>{{ user.password }}</td>
<td class="text-center">
<a href="/update_user/?user_id={{ user.id }}"
class="btn btn-success btn-xs">修改</a>
<a href="/delete/?user_id={{ user.id }}"
class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
"""
Django ORM中创建表关系
"""
表与表之间的关系
一对多
多对多
一对一
没有关系
判断表关系的方法:换位思考
"""
图书表
出版社表
作者表
作者详情表
"""
图书和出版社是一对多的关系 外键字段建在多的那一方 book
图书和作者是多对多的关系 需要创建第三张表来专门存储
作者与作者详情表是一对一
"""
from django.db import models
# Create your models here.
# 创建表关系 先将基表创建出来 然后再添加外键字段
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2)
# 总共八位 小数点后面占两位
"""
图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面
"""
publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
"""
如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id
如果你自作聪明的加了_id那么orm还是会在后面继续加_id
后面在定义ForeignKey的时候就不要自己加_id
"""
"""
图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐建在查询频率较高的一方
"""
authors = models.ManyToManyField(to='Author')
"""
authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
让orm自动帮你创建第三张关系表
"""
class Publish(models.Model):
name = models.CharField(max_length=32)
addr = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
"""
作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中
"""
author_detail = models.OneToOneField(to='AuthorDetail')
"""
OneToOneField也会自动给字段加_id后缀
所以你也不要自作聪明的自己加_id
"""
class AuthorDetail(models.Model):
phone = models.BigIntegerField() # 或者直接字符类型
addr = models.CharField(max_length=32)
"""
orm中如何定义三种关系
publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联
authors = models.ManyToManyField(to='Author')
author_detail = models.OneToOneField(to='AuthorDetail')
ForeignKey、OneToOneField会自动在字段后面加_id后缀
"""
# 在django1.X版本中外键默认都是级联更新删除的
# 多对多的表关系可以有好几种创建方式 这里暂且先介绍一种
Django的生命流程图
1. 用户先从浏览器发起HTTP请求
2. 请求就来到了web服务器(web服务网关接口)
socktet部分
wsgiref模块实现的socket服务端
"""
1. 请求来的时候,把HTTP格式的数据封装打包成一个字典
2. 响应走的时候,把数据封装成符合HTTP格式的数据返回给浏览器
"""
# 后面还给它改成uwsgi服务器
# wsgiref、uwsgi他们两个也都会遵循一个协议:WSGI协议
https://www.yuque.com/liyangqit/cbndkh/evyps8
3. Django应用
4. 中间件
5. 路由层
6. 视图层
7. 模板层
8. DB
"""混合项目:前端页面和Python代码都写在一个项目里面,前后端分离,前端是一个项目,后端是一个项目,中间通过json格式的数据进行数据传输"""
fooloop方法
{% for %}标签内部模板变量forloop
在{% for %}循环内部,可以访问一个名为forloop的模板变量。这个变量有若干属性,通过它们可以获知循环进程的一些信息。
# forloop.counter
forloop.counter 的值是一个整数,表示循环的次数。这个属性的值从 1 开始,因此第一次循环时,forloop.counter 等于 1 。
{% for item in todo_list %}
<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}
# forloop.counter0
forloop.counter0 与 forloop.counter 类似,不过是从零开始的。第一次循环时,其值为 0 。
# forloop.revcounter
forloop.revcounter的值是一个整数,表示循环中剩余的元素数量。第一次循环时, forloop.revcounter 的值是序列中要遍历的元素总数。最后一次循环时, forloop.revcounter的值为 1 。
# forloop.revcounter0
forloop.revcounter0 与 forloop.revcounter类似,不过索引是基于零的。第一次循环时, forloop.revcounter0的值是序列中元素数量减去一。最后一次循环时, forloop.revcounter0 的值为 0 。
# forloop.first
forloop.first 是个布尔值,第一次循环时为 True 。需要特殊处理第一个元素时很方便:
{% for object in objects %}
{% if forloop.first %}
<li class="first">
{% else %}
<li>
{% endif %}
{{ object }}
</li>
{% endfor %}
# forloop.last
forloop.last是个布尔值,最后一次循环时为True 。经常用它在一组链接之间放置管道符号:
{% for link in links %}
{{ link }}{% if not forloop.last %} | {% endif %}
{% endfor %}
上述模板代码的输出可能是:
Link1 | Link2 | Link3 | Link4
此外,还经常用它在一组单词之间放置逗号:
<p>Favorite places:</p>
{% for p in places %}
{{ p }}{% if not forloop.last %}, {% endif %}
{% endfor %}
forloop.parentloop
在嵌套的循环中, forloop.parentloop引用父级循环的 forloop 对象。下面举个例子:
{% for country in countries %}
<table>
{% for city in country.city_list %}
<tr>
<td>Country #{{ forloop.parentloop.counter }}</td>
<td>City #{{ forloop.counter }}</td>
<td>{{ city }}</td>
</tr>
{% endfor %}
</table>
{% endfor %}
小贴士
forloop 变量只在循环内部可用。模板解析器遇到 {% endfor %} 时, forloop 随之消失。
上下文和 forloop 变量
在 {% for %} 块中,现有变量会让位,防止覆盖 forloop 变量。Django 把移动的上下文放到
forloop.parentloop 中。通常,你无须担心,但是如果有名为 forloop 的模板变量(不建议这
么做),在 {% for %} 块中会重命名为 forloop.parentloop 。