Django 模型中用于将 HTML5 类型"month"保存在数据库中的数据类型



我有一个HTML表单,其中包含一个将输入作为月份的字段

<input type='month' name="last_appraisal" id='txtLastAppraisal' value='2013-12' />

在我的Django模型中,这个字段被定义为

last_appraisal = models.DateField(blank=True, null=True)

当我试图将这个值(从request.POST收到)保存在数据库中时,我会得到格式错误。

last_appraisal = request.POST.get('last_appraisal','')
if last_appraisal != '':
mymodel.last_appraisal = last_appraisal
mymodel.save()
ERROR: raise exceptions.ValidationError(msg)
ValidationError: [u"'2013-01' value has an invalid date format. It must be in YYYY-MM-DD format."]

我知道我可以通过在这个输入月份添加一个默认的日期(可能是01)来实现这一点,然后保存到数据库中。在取回这个值时,我可以像"YYYY-MM"一样重新格式化它,并将其发送回模板。

但我想知道是否有更好的方法来实现这一点。我使用的是Django 1.5.1和Python 2.7。

编辑时间:在阅读了所有的回复之后,很明显Django没有内置的对这种格式的支持。现在我几乎没有选择

  1. 我在日期字段中添加日期的方法
  2. 正如@Odif所建议的,将数据库字段作为"CharField">
  3. 正如@Ghopper21建议的那样,创建一个自定义Django字段

我的偏好将是选择1,因为使用此

  1. 与choice3相比,我不必写一些额外复杂的代码
  2. 我可以灵活地在表格搜索中使用这个字段,比如"查找2013年6月获得评估的所有候选人",如果我选择chioce2,我就会失去它

不知道我的选择是好是坏,但考虑到项目的规模和完成它的时间,我认为这将是最好的选择。如果你认为这绝对是垃圾,或者你赞成这种方法,请发表评论。

这里有两个问题:Django没有内置的方法来处理仅月/年的日期,Python也没有。

如果您可以用一种方便的方法将仅月/年的日期转换为日期设置为1的完整日期,但又不想每次都在视图代码中手动执行此操作,那么您可以将该逻辑封装在自定义Django小部件中,该小部件是用于在Django字段表示(在本例中为DateField)和HTML输入字段之间进行转换的组件。

如果您需要以第一类的方式将日期的底层Python表示形式仅为月/年,我建议您查看优秀的Python库dateutilrelativedelta类,它允许您指定类似relativedelta(year=2013, month=12)的内容。如果您想使用它,那么您必须创建一个自定义的Django模型字段,该字段通过序列化在relativedelta实例和数据库存储之间进行转换。然后,您仍然需要一个用于HTML方面的自定义小部件。

使用模型。CharField。DateField和DateTimeField分别需要date和datetime对象。由于"2013-01"不能被强制为任何一个,因此请使用CharField。或者使用integerfield并在月后使用。

最新更新