django: SplitDateTimeWidget ignores date_format

风格不统一 提交于 2020-01-06 19:41:35

问题


I am trying to use the SplitDateTimeWidget but want it to accept date in day - month - year format.

from django.forms.widgets import SplitDateTimeWidget

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        widgets = {'start': SplitDateTimeWidget(date_format='%d/%m/%Y')}

The SplitDateTimeWidget accepts a date_format argument, which I expect to be used to validate the date input but it isn't.

The default widget is correctly replaced but it ignores the date_format and insists on validating against the default month - day - year.

I also tried setting the DATE_FORMAT and DATE_INPUT_FORMATS settings with no luck.

Thanks for any help.


回答1:


Widget date format responsible only for output and does not matter for validation. What matters is field type, and in case of SplitDateTimeField it uses DateField and TimeField which are instantiated using input_date_formats parameter.

So the answer is:

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        widgets = {'start': SplitDateTimeWidget(date_format='%d/%m/%Y')}

    start = SplitDateTimeField(input_date_formats='d/m/Y',
                               input_time_formats='<whatever, or skip it>')

Note that input_date_formats is a Django format, http://docs.djangoproject.com/en/dev/ref/templates/builtins/#date




回答2:


This worked for me:

class EventForm(forms.ModelForm):

    start = SplitDateTimeField(input_date_formats=['%d/%m/%Y'],
                               input_time_formats=['%H:%M'], 
                               widget=SplitDateTimeWidget(date_format='%d/%m/%Y',
                                                          time_format='%H:%M'),
                               )

    class Meta:
        model = Event



回答3:


I had the same problem, trying to make the date part of SplitDateTimeField accept dates in the format '%d/%m/%Y'.

The solution above by Marat did not work for me(including the correction to it by omat)

I have finally solved the problem by overriding the default list of datetime input formats in settings.py:

DATETIME_INPUT_FORMATS = ('%d/%m/%Y %I:%M', '%Y-%m-%d %H:%M', '%Y-%m-%d',
    '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M', '%m/%d/%Y',
    '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M', '%m/%d/%y')

I added the desired format as the first in the list so it will take precedence over the others.

From Django documentation: "Formats will be tried in order, using the first valid"



来源:https://stackoverflow.com/questions/7675814/django-splitdatetimewidget-ignores-date-format

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!