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
相关产品推荐
相关产品推荐

