python Django 学习笔记 2020-11-12(template中循环计数forloop.counter,数据库查找出的数据经过计算后和原数据或数组一起显示)

12 篇文章 0 订阅

1、forloop.counter计数

想要在使用for...in range(...)结果不支持,因此这里改成使用{{ forloop.counter }}

{{ forloop.counter0 }}:以0开始的循环计数。
{{ forloop.counter }}:以1开始的循环计数。

{{ forloop.revcounter0 }}:以0结尾的倒序计数,先遍历元素个数,然后倒序计数。
{{ forloop.revcounter }}:以1结尾的倒序计数,先遍历元素个数,然后倒序计数。

forloop.first:第一个为True,其余为Flase
forloop.last:最后一个为True,其余为Flase

使用时:(以tbody演示)

<tbody>
    {% for created_item in created_items %}
        <tr>
            <td style="text-align:center;">{{created_item.item_name}}</td>     <!--名称-->
            <td style="text-align:center;">{{created_item.emergency_signal}}</td>  <!--紧急信号-->
            <td style="text-align:center;">{{ forloop.counter0 }}</td>  <!--计数-->
         </tr>
    {% endfor %}
</tbody>

运行结果:
{{ forloop.counter0 }}
在这里插入图片描述
{{ forloop.revcounter0 }}
在这里插入图片描述

forloop.first
在这里插入图片描述

2、数据库查找出的内容经过计算后和原内容一起显示

想把数据库查找到的数据和该内容经过一系列计算以后的数据一起显示,碰到一大堆问题。由于html是静态的,我想读取数组的同时读取models.py中类的对象,而使用forloop.counter作为数组的下标又会报错。找了好久都没找到方法。最后想了一下午(脑阔子都要抓破了),想到了两种方法,终于把问题解决了。

方法1:

使用两张表,一张表显示数据库查找到的内容,一张表显示数组内容,只要两组数据顺序对应就行了。但是当页面滚轮放缩时显示会出现问题,所以没采用。

方法2:

在数据库表中新增一个属性,其内容始终为空。于是乎用于接收数据库查找内容的对象也就拥有了这个属性,就可以把计算好的内容放到这个属性中。想要把数组和数据库内容联合显示也可以这样搞。

下面以我的为例,我是通过读取创建时间和周期,然后计算出剩余的时间,然后和数据库查找到的内容一起显示在表格中:

# 在models.py的表中创建一个属性空位(最好加defalut='',不然新增属性如果增加数据的格式错误容易出问题)
remaining_time = models.CharField(max_length=50, default='')  # 剩余日期
# 在terminal中生成迁移文件并同步到数据库
python manage.py makemigrations
python manage.py migrate
# 所有用到这张表插入数据的create方法的地方最好补齐属性
models.CreateItem.objects.create(item_name=item_name, duty_peo=duty_peo, total_date=last_date
    , participate_member=participate_member[:-1]
    , create_date_time=create_date_time
    , emergency_signal=emergency_level
    , remaining_time="").save()      #新增

然后开始过程的计算:

# 取第一条日期试试
remaining_time = created_items[1].total_date -   # 周期
(datetime.now().replace(tzinfo=pytz.timezone('UTC'))-created_items[1].create_date_time).days
# 当前日期减去创建日期

在前端显示了看一下:

<td style="text-align:center;">{{  remaining_time }}</td>  <!--计数-->

运行结果:
在这里插入图片描述
可以!

将数据塞入数据库对象的属性中:(数组也可以如此循环插入到属性中)

# 接收那张表的对象
created_items = models.CreateItem.objects.all()
# 写一个循环,把计算的变量依次塞入其remaining_time属性中
for i in range(len(created_items)):
    created_items[i].remaining_time = created_items[i].total_date - (datetime.now().replace(tzinfo=pytz.timezone('UTC'))-created_items[i].create_date_time).days

接着直接在html前端读取其remaining_time属性:

<td style="text-align:center;">{{  created_item.remaining_time }}</td>  <!--计数-->

运行结果:
在这里插入图片描述
完美!

3、日常报错

两个日期相减报错,now()减去数据库中取出的日期时间。
报错: can't subtract offset-naive and offset-aware datetimes
原因: 数据库取出来的datetimenow()时区不同
解决方法:

# 添加pytz模块
import pytz
# 转时区
datetime.now().replace(tzinfo=pytz.timezone('UTC')) - created_items[1].create_date_time

参考自:https://blog.csdn.net/qq_25420115/article/details/53149669

4、datetime.timedelta时间差转为int

datetime直接相减得到的结果是天数+时间的格式,把它转为int型使用:

# 只要在最后加个days即可
(datetime.now().replace(tzinfo=pytz.timezone('UTC'))-created_items[1].create_date_time).days

参考自:https://blog.csdn.net/yxys01/article/details/104192299/

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值