我有以下型号:
class Sponsorship(models.Model):
sponsor = models.ForeignKey(Sponsor, related_name='sponsorships')
start_datetime = models.DateTimeField(null=True, blank=True)
end_datetime = models.DateTimeField(null=True, blank=True)
模型的形式如下:
class SponsorshipForm(ModelForm):
class Meta:
model = Sponsorship
fields = ('start_datetime', 'end_datetime')
widgets = {
'start_datetime': forms.DateTimeInput(attrs={'class':
'form-control'}),
'end_datetime': forms.DateTimeInput(attrs={'class':
'form-control'}),
}
SponsorShipsFormSet = inlineformset_factory(Sponsor, Sponsorship,
form=SponsorshipForm, extra=2)
在视图中我按照惯例做的事情:
SponsorShipsFormSet(instance=self.object)
但是,在呈现表单时,日期时间输入字段只有值的日期,没有时间。
为什么表单没有用日期和时间实例化?
修改
我在模板中打印了输入字段的值:
{{ form.start_datetime.value }}
它确实具有日期时间值。
答案 0 :(得分:1)
好的,这是对百万分之一的见解!
所有这些大惊小怪的原因来自设置DATETIME_INPUT_FORMATS
。
我之前的所作所为:
DATETIME_INPUT_FORMATS = (
'%d %B %Y', # '05 March 2014'
'%d %B %Y - %H:%M', # '05 March 2014 - 08:07'
'%d %B %Y - %H:%M:%S', # '05 March 2014 - 08:07:59'
'%d %B %Y - %H:%M:%S.%f', # '05 March 2014 - 08:07:59.0001'
'%d/%m/%Y %H:%M:%S.%f', # '25/10/05 14:30:59.000200'
'%d/%m/%Y %H:%M:%S', # '25/10/05 14:30:59'
'%d/%m/%Y %H:%M', # '25/10/05 14:30'
'%d/%m/%Y', # '25/10/05'
'%d-%m-%Y %H:%M:%S.%f', # '25-10-05 14:30:59.000200'
'%d-%m-%Y %H:%M:%S', # '25-10-05 14:30:59'
'%d-%m-%Y %H:%M', # '25-10-05 14:30'
'%d-%m-%Y', # '25-10-05'
'%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y', # '10/25/06'
)
解决了我的问题:
DATETIME_INPUT_FORMATS = (
'%d %B %Y - %H:%M:%S.%f', # '05 March 2014 - 08:07:59.0001'
'%d %B %Y - %H:%M:%S', # '05 March 2014 - 08:07:59'
'%d %B %Y - %H:%M', # '05 March 2014 - 08:07'
'%d %B %Y', # '05 March 2014' <- this line was first before
'%d/%m/%Y %H:%M:%S.%f', # '25/10/05 14:30:59.000200'
'%d/%m/%Y %H:%M:%S', # '25/10/05 14:30:59'
'%d/%m/%Y %H:%M', # '25/10/05 14:30'
'%d/%m/%Y', # '25/10/05'
'%d-%m-%Y %H:%M:%S.%f', # '25-10-05 14:30:59.000200'
'%d-%m-%Y %H:%M:%S', # '25-10-05 14:30:59'
'%d-%m-%Y %H:%M', # '25-10-05 14:30'
'%d-%m-%Y', # '25-10-05'
'%Y-%m-%d %H:%M:%S.%f', # '2006-10-25 14:30:59.000200'
'%Y-%m-%d %H:%M:%S', # '2006-10-25 14:30:59'
'%Y-%m-%d %H:%M', # '2006-10-25 14:30'
'%Y-%m-%d', # '2006-10-25'
'%m/%d/%Y %H:%M:%S.%f', # '10/25/2006 14:30:59.000200'
'%m/%d/%Y %H:%M:%S', # '10/25/2006 14:30:59'
'%m/%d/%Y %H:%M', # '10/25/2006 14:30'
'%m/%d/%Y', # '10/25/2006'
'%m/%d/%y %H:%M:%S.%f', # '10/25/06 14:30:59.000200'
'%m/%d/%y %H:%M:%S', # '10/25/06 14:30:59'
'%m/%d/%y %H:%M', # '10/25/06 14:30'
'%m/%d/%y', # '10/25/06'
)
所以,洞察力是:
当django在表单中呈现日期时,它从DATETIME_INPUT_FORMATS
读取并使用第一种适合的格式。因此,格式应该从具有最多细节的格式变为具有最少细节的格式。
另一方面,当django从客户端读取日期时间输入时,它会遍历所有DATETIME_INPUT_FORMATS
,直到找到适合的那个,如果没有,则日期时间将无效。