You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模型时间戳展示问题:无法显示及移动项时批量更新异常

解决方案

1. 修正DateTimeField的参数设置

你现在用auto_now=True会导致每次调用save()方法时都会更新字段值,这就是移项时所有时间戳被批量更新的核心原因。你需要的是记录「首次加入列表的时间」,应该改用auto_now_add=True:

from django.db import models

class Playinglist(models.Model):
    # 其他业务字段...
    started_on = models.DateTimeField(auto_now_add=True)  # 仅在实例首次保存时自动设置时间

class Playedlist(models.Model):
    # 其他业务字段...
    finished_on = models.DateTimeField(auto_now_add=True)  # 仅在实例首次保存时自动设置时间

auto_now_add=True只会在模型实例第一次被写入数据库时填充当前时间,后续任何修改或保存操作都不会改变这个值,完全匹配你记录「开始播放/结束播放时间」的需求。

2. 调整移项的视图逻辑

移项时不要直接修改原Playinglist实例并批量保存,而是创建新的Playedlist实例,把原列表项的业务数据复制过去,再删除原Playinglist中的对应项:

def move_to_played(request, item_id):
    # 获取要移动的目标播放项
    playing_item = Playinglist.objects.get(id=item_id)
    # 创建Playedlist实例,finished_on会自动设置为当前时间
    Playedlist.objects.create(
        title=playing_item.title,
        duration=playing_item.duration,
        # 复制其他需要的业务字段
    )
    # 删除原列表中的项
    playing_item.delete()
    return redirect('your_page_name')

这种方式只会触发单个新实例的时间戳设置,不会影响其他列表项的时间戳。

3. 修复时间戳展示问题

如果最初Playinglist无返回结果,检查你的查询逻辑:

  • 确保使用正确的查询集,比如Playinglist.objects.all()(auto_now_add=True会自动填充时间,无需担心字段为空的情况,不要错误过滤)
  • 模板中展示时间戳时,用Django日期过滤器格式化输出,避免格式问题导致的显示异常:
{% for item in playinglist_items %}
    <div>开始播放时间: {{ item.started_on|date:"Y-m-d H:i:s" }}</div>
{% endfor %}

同时确认视图传递到模板的上下文变量名,和模板中遍历的变量名完全一致。

内容的提问来源于stack exchange,提问作者agold95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:53:29