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
原因: 数据库取出来的datetime
和now()
时区不同
解决方法:
# 添加pytz模块
import pytz
# 转时区
datetime.now().replace(tzinfo=pytz.timezone('UTC')) - created_items[1].create_date_time
4、datetime.timedelta时间差转为int
datetime
直接相减得到的结果是天数+时间的格式,把它转为int型使用:
# 只要在最后加个days即可
(datetime.now().replace(tzinfo=pytz.timezone('UTC'))-created_items[1].create_date_time).days