转自:http://www.nanerbang.com/article/5488/html
建立django的model时,有DateTimeField、DateField和TimeField三种类型能够用来建立日期字段,其值分别对应着datetime()、date()、time()三中对象。这三个field有着相同的参数auto_now和auto_now_add,表面上看起来很easy,但实际使用中很容易出错,下面是一些注意点。python
这个参数的默认值为false,设置为true时,可以在保存该字段时,将其值设置为当前时间,而且每次修改model,都会自动更新。所以这个参数在须要存储“最后修改时间”的场景下,十分方便。须要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你没法程序中手动为字段赋值;若是使用django再带的admin管理器,那么该字段在admin中是只读的。数据库
这个参数的默认值也为False,设置为True时,会在model对象第一次被建立时,将字段的值设置为建立时的时间,之后修改对象时,字段的值不会再更新。该属性一般被用在存储“建立时间”的场景下。与auto_now相似,auto_now_add也具备强制性,一旦被设置为True,就没法在程序中手动为字段赋值,在admin中字段也会成为只读的。django
auto_now和auto_now_add被设置为True后,这样作会致使字段成为editable=False和blank=True的状态。editable=False将致使字段不会被呈如今admin中,blank=Ture表示容许在表单中不输入值。此时,若是在admin的fields或fieldset中强行加入该日期时间字段,那么程序会报错,admin没法打开;若是在admin中修改对象时,想要看到日期和时间,能够将日期时间字段添加到admin类的readonly_fields中:spa
class YourAdmin(admin.ModelAdmin): readonly_fields = ('save_date', 'mod_date',) admin.site.register(Tag, YourAdmin)
那么问题来了。实际场景中,每每既但愿在对象的建立时间默认被设置为当前值,又但愿能在往后修改它。怎么实现这种需求呢?code
django中全部的model字段都拥有一个default参数,用来给字段设置默认值。能够用default=timezone.now来替换auto_now=True或auto_now_add=True。timezone.now对应着django.utils.timezone.now(),所以须要写成相似下面的形式:htm
from django.db import models import django.utils.timezone as timezone class Doc(models.Model): add_date = models.DateTimeField('保存日期',default = timezone.now) mod_date = models.DateTimeField('最后修改日期', auto_now = True
html页面从数据库中读出DateTimeField字段时,显示的时间格式和数据库中存放的格式不一致,好比数据库字段内容为2016-06-03 13:00:00,可是页面显示的倒是Apr. 03, 2016, 1 p.m.对象
为了页面和数据库中显示一致,须要在页面格式化时间,须要添加<td>{{ infor.updatetime|date:"Y-m-d H:i:s" }}</td> 相似的过滤器。刷新页面,便可正常显示。blog