【问题标题】:save date in one format in database - Django [duplicate]在数据库中以一种格式保存日期 - Django [重复]
【发布时间】:2013-06-18 10:43:59
【问题描述】:

forms.py

INPUT_FORMAT = (
('%d/%m/%Y','%m/%d/%Y')
)
class ReportDatetimeForm(forms.ModelForm):
date = forms.DateField(input_formats = INPUT_FORMAT,
widget=forms.DateInput()

class Meta:
model = Report
fields = ['date']

这是我以两种不同格式将输入作为日期输入的表单。以这种格式%m/%d/%Y' 提供输入日期时,日期和月份在保存在数据库中时会互换。这会影响我的应用程序。所以我想保存两种输入格式都采用单一格式,即yyyy-mm-dd,因此用户输入的任何输入格式,给定的格式都应保存为上述格式。

我想知道如何在forms.py中编写一个自定义函数,以单一格式将日期保存在数据库中。

谢谢

【问题讨论】:

  • 您已经问过这个问题的变体至少 3 次了。停止滥用 stackoverflow。我已经提供了关于您为什么会遇到问题的推理,这不是代码问题。您不了解使用日期时间的基础知识。和你的同事谈谈,也许他们可以帮助你了解你做错了什么。

标签: python django django-models django-forms django-views


【解决方案1】:

存储在数据库中的实际日期与进入该字段的输入文本无关。日期存储为日期对象,而不是任意字符串。

您面临的问题是,您列出的两种有效格式有时会针对相同的输入生成不同的日期对象。它们是模棱两可的。

如果用户在您的表单字段中输入字符串“01/02/1990”,实际日期是什么?是 1990 年 2 月 1 日吗?还是 1990 年 1 月 2 日?在您的特定实现中,选择的日期将是第一种格式:2 月 1 日。它将按顺序检查每种日期格式,并尝试解析日期。如果成功,则创建日期并保存。如果不成功,它会尝试每个连续的格式。

要么选择一种格式,要么选择永远不会模棱两可的多种格式。使用 javascript 日历选择器非常有用,甚至可以为日期的各个部分单独输入文本。

您应该做的只是在您的 django 表单中允许 ISO8601 日期格式“YYYY-MM-DD”。从 UI 中,您可以允许用户以他们喜欢的任何格式输入日期,只要您在发送到服务器之前将其(使用 javascript)转换为“YYYY-MM-DD”格式。但是你应该做的是有 3 个单独的文本输入 - 一个用于日、月和年。

【讨论】:

  • 不,这不是问题所在。我解释了问题所在。尝试输入此日期:“12/29/2013”​​并查看日期是否在数据库中正确显示。在 UI 中选择日期格式对允许的表单日期格式绝对没有影响。您提供了一个不明确的日期作为字符串,并且表单正在按顺序尝试您的输入并选择那个。
  • 乔希,当输入的日期和月份都小于 12 时,会出现此问题,如何使其适用于所有输入格式/如何解决此问题。我从上周五开始遇到这个问题,请在代码级别告诉我如何解决这个问题。
  • @user2086641 我知道它什么时候发生。我的回答解释了为什么会这样。我的回答还解释了您应该如何修复它。这不是您要解决的代码问题,而是常识问题。 “01/02/2013”​​是模棱两可的。在表单中使用 3 个单独的文本输入;日、月、年各一个。然后在表单的“保存”方法中构造一个实际的日期对象。停止对这个特定问题使用 ModelForms 并使用标准表单。您首先需要了解实际问题是什么。我已经尽力了。
猜你喜欢
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 2017-04-29
  • 2012-01-27
  • 1970-01-01
  • 2023-04-02
  • 2017-07-03
  • 2017-06-24
相关资源
最近更新 更多