Django Forms - DateTime字段仅显示日期

时间:2014-03-05 10:42:46

标签: django django-forms

我有以下型号:

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

它确实具有日期时间值。

1 个答案:

答案 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,直到找到适合的那个,如果没有,则日期时间将无效。