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

Django:更新表单时不修改auto_now=True的日期/时间字段

解决Django编辑Game事件时不更新auto_now=True字段的问题

问题场景

开发记录类应用时,Game模型的date和time字段设置了auto_now=True,导致用户编辑事件时这两个字段会被自动更新为当前时间,不符合需求——希望保留创建时的原始日期和时间。

解决方案

方法一:修改Model字段参数(推荐)

将auto_now=True替换为auto_now_add=True,这样字段只会在创建对象时自动设置为当前时间,后续更新操作不会改变其值:

# models.py
class Game(models.Model):
    # ... 其他字段保持不变
    date = models.DateField(auto_now_add=True)
    time = models.TimeField(auto_now_add=True)

注意:如果需要允许用户手动修改这两个字段的值,需在表单中移除对它们的exclude设置,并添加到fields列表中。

方法二:在更新视图中手动保留原始值

如果不想修改Model字段参数,可在更新视图中先保存原始的日期和时间,再在保存表单时恢复:

# views.py
@login_required(login_url='my-login')
def update_game(request, game_id):
    game = Game.objects.get(pk=game_id)
    # 保存原始日期和时间
    original_date = game.date
    original_time = game.time
    
    form = UpdateGameForm(request.POST or None, instance=game)
    if form.is_valid():
        obj = form.save(commit=False)
        # 恢复原始日期和时间
        obj.date = original_date
        obj.time = original_time
        obj.save()
        return redirect('/view-games')

    context = {'game': game, 'form': form}
    return render(request, 'gametracker_app/update-game.html', context=context)

方法三:自定义Model的save方法

通过重写Model的save方法,区分创建和更新操作,仅在创建时设置日期时间:

# models.py
from django.utils import timezone

class Game(models.Model):
    # ... 其他字段保持不变
    date = models.DateField(null=True)
    time = models.TimeField(null=True)

    def save(self, *args, **kwargs):
        # 仅在创建对象时设置日期时间
        if not self.pk:
            self.date = timezone.now().date()
            self.time = timezone.now().time()
        super().save(*args, **kwargs)

注意:需移除字段原来的auto_now=True参数。

内容的提问来源于stack exchange,提问作者bld-sync

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:25:10