我有一个名为Blog
的django模型。
我想在last_modified_date的当前模型中添加一个字段。我知道如何设置默认值,但我想以某种方式让它随时通过管理界面修改博客条目时自动更新。
是否有某种方法可以将此值强制为每个管理站点保存的当前时间?
还有一些方法可以添加mod_count
字段,并在每次修改管理网站博客条目时自动计算它吗?
答案 0 :(得分:12)
在模型中创建DateTimeField
。每当保存时都会更新。这要求您使用auto_now_add
选项:
class DateTimeField([auto_now=False, auto_now_add=False, **options])
DateTimeField.auto_now_add¶
每次保存对象时自动将字段设置为现在。有用 用于“最后修改”的时间戳。注意 始终使用当前日期; 它不仅仅是你的默认值 可以覆盖。
看起来应该是这样的:
class Message(models.Model):
message = models.TextField()
active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
对于第二部分,我认为你必须超载
ModelAdmin.save_model(self, request, obj, form, change)
James Bennett描述here。它看起来像这样:
class EntryAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if change:
obj.change_count += 1
obj.save()
答案 1 :(得分:6)
接受的答案不再正确。
对于较新的django版本,您必须使用auto_now=True
参数而不是auto_now_add=True
,这只会在最初创建对象时设置字段值。
DateField.auto_now_add¶
当自动将字段设置为现在 首先创建对象。用于创建时间戳。
现在,auto_now
实现了所需的功能:
DateField.auto_now¶
每次自动将字段设置为现在 对象被保存。
因此,为了实现自我更新时间戳,应该像这样创建一个模型:
class Message(models.Model):
message = models.TextField()
active = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now=True)
mod_count = models.IntegerField(default=0)
每次修改此模型时,要增加mod_count
,请重载模型的save()
方法:
def save(self, *args, **kwargs):
self.mod_count +=1
return super(Message,self).save(*args, **kwargs)
答案 2 :(得分:2)
有很多方法可以在每次保存时增加编辑次数。
模型本身有一个save()方法,而admin模型有一个model_save()方法。
例如,假设您希望它在使用管理工具编辑时增加....
models.py:
class MyModel(models.Model):
edit_count = models.IntegerField()
# ... rest of model code here...
admin.py:
class MyModelAdmin(admin.ModelAdmin)
def save_model(self, request, obj, form, change):
if not change:
obj.edit_count = 1
else:
obj.edit_count += 1
obj.save()
您也可以在模型save()事件中执行类似的代码。
您可能感兴趣的其他内容是django-command-extensions。它添加了两个可能对您有帮助的字段:
CreationDateTimeField - DateTimeField,它将自动设置对象首次保存到数据库时的日期。
ModificationDateTimeField - DateTimeField,它将自动设置对象保存到数据库时的日期。
答案 3 :(得分:0)
您还可以使用此处找到的中间件解决方案:https://bitbucket.org/amenasse/django-current-user/src/7c3c90c8f5e854fedcb04479d912c1b9f6f2a5b9/current_user?at=default
....
MIDDLEWARE_CLASSES = (
....
'current_user.middleware.CurrentUserMiddleware',
'current_user.middleware.CreateUserMiddleware',
)
....
INSTALLED_APPS = (
'current_user',
....
....
)
class ExampleModel(models.Model):
foo = models.IntegerField()
last_user = CurrentUserField(related_name="+")
created_by = CreateUserField(related_name="+")