首页 > 其他分享 >django:DateTimeField如何自动设置为当前时间并且能被修改

django:DateTimeField如何自动设置为当前时间并且能被修改

时间:2023-05-21 23:31:44浏览次数:37  
标签:admin auto django DateTimeField 修改 date timezone now


创建django的model时,有DateTimeField、DateField和TimeField三种类型可以用来创建日期字段,其值分别对应着datetime()、date()、time()三中对象。这三个field有着相同的参数auto_now和auto_now_add,表面上看起来很easy,但实际使用中很容易出错,下面是一些注意点。

DateTimeField.auto_now

这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会自动更新。因此这个参数在需要存储“最后修改时间”的场景下,十分方便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,而是指字段会被“强制”更新到当前时间,你无法程序中手动为字段赋值;如果使用django再带的admin管理器,那么该字段在admin中是只读的。

DateTimeField.auto_now_add

这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被用在存储“创建时间”的场景下。与auto_now类似,auto_now_add也具有强制性,一旦被设置为True,就无法在程序中手动为字段赋值,在admin中字段也会成为只读的。

admin中的日期时间字段

auto_now和auto_now_add被设置为True后,这样做会导致字段成为editable=False和blank=True的状态。editable=False将导致字段不会被呈现在admin中,blank=Ture表示允许在表单中不输入值。此时,如果在admin的fields或fieldset中强行加入该日期时间字段,那么程序会报错,admin无法打开;如果在admin中修改对象时,想要看到日期和时间,可以将日期时间字段添加到admin类的readonly_fields中:

class YourAdmin(admin.ModelAdmin):
    readonly_fields = ('save_date', 'mod_date',)
admin.site.register(Tag, YourAdmin)
class YourAdmin(admin.ModelAdmin):
    readonly_fields = ('save_date', 'mod_date',)
admin.site.register(Tag, YourAdmin)

如何将创建时间设置为“默认当前”并且可修改

那么问题来了。实际场景中,往往既希望在对象的创建时间默认被设置为当前值,又希望能在日后修改它。怎么实现这种需求呢?

django中所有的model字段都拥有一个default参数,用来给字段设置默认值。可以用default=timezone.now来替换auto_now=True或auto_now_add=True。timezone.now对应着django.utils.timezone.now(),因此需要写成类似下面的形式:

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)
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)

 

标签:admin,auto,django,DateTimeField,修改,date,timezone,now
From: https://blog.51cto.com/u_6186189/6320693

相关文章

  • Django Model 定义语法
    简单用法fromdjango.dbimportmodelsclassPerson(models.Model):first_name=models.CharField(max_length=30)last_name=models.CharField(max_length=30)fromdjango.dbimportmodelsclassPerson(models.Model):first_name=models.CharField(max_......
  • matlab默认工作路径的修改方法,永久的
    说起来也简单,就是到安装路径文件夹下C:\ProgramFiles\R2011a\toolbox\local找文件mathrc.m文件,在最后一行添加cd'你想要的默认路径下文件夹',andifyoufinishthisstep,thenyoumakeit.......
  • 本博客样式修改
    在浏览博客园的文章时发现一个比较喜欢的样式,并尝试使用,挺满意顾记录本文并感谢样式设计者。参考相关文档配置即可。我的博客侧边栏公告配置如下:<scripttype="text/javascript">window.cnblogsConfig={title:{onblur:'修己以安人',focus:'修己......
  • Django后台 + Wordpress主题,只要自己看上的主题都可以让它变成自己的
    既然学习了PythonWeb怎么能没有自己的一个小站呢?没有自己精心打造的一个小站怎么敢说自己学习过PythonWeb呢?说的再多不如直接干,我的个人网站也已经部署上线。Django后台+Wordpress主题,只要自己看上的主题都可以让它变成自己的为什么要选择Wordpress主题呢?自己在刚开始学习P......
  • 简要介绍django框架
    Django是一个高级的PythonWeb框架,它鼓励快速开发和干净、实用的设计。Django遵循MVC(模型-视图-控制器)设计模式,使得开发者能够更轻松地组织代码和实现功能。以下是Django框架的一些主要组件:模型(Model):模型是数据的抽象表示,用于定义数据结构。在Django中,模型通常与数据库表相对......
  • Word批量修改图片环绕方式与尺寸大小
    前提:一份Word文档里面有100张图片,有大有小,需要将100张图片更改为统一大小,宽度与高度均为5厘米,同时环绕方式也需要改成四周型。默认Word图片的默认环绕方式为嵌入型,需要统一更改为四周型,然后才能批量更改大小,而批量更改大小方式需要使用VBA代码。第一步:打开 Word文档,并按下Alt+......
  • 字节码增强javassist 使用javassist运行时动态修改字节码对象
    java程序什么时候需要在运行的时候动态修改字节码对象?如何在运行的时候动态修改字节码对象?修改字节码对象的时候会发生哪些错误,又该如何解决这些问题?一、java程序什么时候需要在运行的时候动态修改字节码对象我认为有两种场景,一种是无法修改源代码的时候;另外一种是功能增强的......
  • 微信扫码登录(new WxLogin)二维码样式修改
    一、自定义二维码样式例如:.impowerBox.qrcode{width:180px;}.impowerBox.title{display:none;}.impowerBox.info{width:180px;}.status_icon{display:none}.impowerBox.status{text-align:center;}二、自定义二维码样式进行base64加密(在线加密解密网站)......
  • 使用Python脚本修改Linux用户的密码
    直接上代码使用python,通过系统默认的passwd命令,修改用户Tom的密码为NewPasswordimportsubprocess#Gettheusernameandnewpasswordfromtheuserusername="Tom"new_password="NewPassword"#Usethe'passwd'commandtoupdatethepassword#Th......
  • Oracle从入门到精通-合并查询、添加修改删除数据
    6Oracle表的管理6.5oracle表的管理-表查询(重点)6.5.5Oracle表复杂查询--合并查询·合并查询有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号union,unionall,intersect,minus1)union该操作符用于取得两个结果集的并集,当使用该操作符时,=selectename,sal,j......