【问题标题】:Django date format issueDjango日期格式问题
【发布时间】:2013-06-15 19:48:42
【问题描述】:

views.py

def calender(request):

    """"""
    settingsform = SettingsForm(instance=settings)
    if request.method == 'POST':
        reportform = ReportDateTimeForm(request.POST, instance=report)
        if reportform.is_valid():
            report = reportform.save(commit=False)
            report.user = request.user
            report.save()
    if settings and settings.date_format:
        date_format = reportform.fields['manual_date'].input_formats[1]
        createddate = report.created_date_time.strftime('%b %d %Y')
    else:
        date_format = reportform.fields['manual_date'].input_formats[0]
        createddate = report.created_date_time.strftime('%d %b %Y')
    date = report.manual_date.strftime(date_format)
    """""" 
    return render_to_response('calender.html',
                               {
                                'reportform': reportform,
                                'settings': settings,
                                'settingsform':settingsform
                                 },
                                 context_instance=RequestContext(request))

forms.py

DATE_FORMAT = (
    ('0', ' dd / mm / yyyy'),
    ('1', 'mm / dd / yyyy'),
)
DATE_INPUT_FORMAT = ['%d/%m/%Y','%m/%d/%Y']

class ReportDateTimeForm(forms.ModelForm):
    manual_date = forms.DateField(input_formats = DATE_INPUT_FORMAT,
                      widget=forms.DateInput(format = '%d/%m/%Y'))

class SettingsForm(forms.ModelForm):
    date_format = forms.ChoiceField(widget=forms.RadioSelect(), choices=DATE_FORMAT, initial='0')

 def __init__(self, *args, **kwargs):
    # Get the date_format if present in parameters
    date_format = None
    if 'date_format' in kwargs:
        date_format = kwargs.pop('date_format')
    # Dynamically set input date format
    super(ReportDateTimeForm, self).__init__(*args, **kwargs)
    if date_format:
        self.fields['manual_date'].input_formats = (date_format, )

SettingsForm 类用于将两种输入格式保存到表格中。它为%m/%d/%Y 格式保存一个int 值“1”,为%d/%m/%Y 格式保存一个“0”。

如果输入格式是 %m/%d/%Y,那么在表单 POST 上,日期的值会以某种方式更改并保存到数据库中,如下所示:如果给定日期是 07/06/2013(2013 年 6 月 7 日) ),它在数据库中保存为 06/07/2013(2013 年 7 月 6 日)。因此,不保存所需的正确日期。

如果选择的格式是%d/%m/%Y,它确实可以正常工作。

【问题讨论】:

  • 我能得到这个问题的任何答案吗?谢谢
  • 您在SettingsForm 中输入的__init__ 代码应该进入ReportDatetimeForm。当您在视图中创建表单时,您需要传递 date_format 关键字 arg。您需要了解链接答案的工作原理。

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


【解决方案1】:

试试这个,

def calender(request):

""""""
settingsform = SettingsForm(instance=settings)

if settings and settings.date_format:
    date_format = reportform.fields['manual_date'].input_formats[1]
    createddate = report.created_date_time.strftime('%b %d %Y')
else:
    date_format = reportform.fields['manual_date'].input_formats[0]
    createddate = report.created_date_time.strftime('%d %b %Y')
date = report.manual_date.strftime(date_format)
if request.method == 'POST':
    reportform = ReportDateTimeForm(request.POST, instance=report,date_format=date_format)
    if reportform.is_valid():
        report = reportform.save(commit=False)
        report.user = request.user
        report.save()
"""""" 
return render_to_response('calender.html',
                           {
                            'reportform': reportform,
                            'settings': settings,
                            'settingsform':settingsform
                             },
                             context_instance=RequestContext(request))

我对你的代码做了一些小改动,我想它会解决你的问题。

干杯

【讨论】:

  • ,我在你的回答的帮助下试过了,问题仍然是他们的。
  • 威尔斯顿,在你的代码的帮助下,我解决了这个问题。我授予了赏金。
【解决方案2】:

SettingsForm.__init__ 中,您的date_format 只是'1''0'。但是你应该得到真正的格式。此外,您应该从 cleaned_data 而不是从 init args 获得 date_format

class SettingsForm(forms.ModelForm):
    date_format = forms.ChoiceField(widget=forms.RadioSelect(), choices=DATE_FORMAT, initial='0')
    manual_date = forms.Date....

 def clean(self, *args, **kwargs):
    super(SettingsForm, self).clean(*args, **kwargs)
    cleaned_data = self.cleaned_data
    date_format = cleaned_data['date_format']
    for (num, candidate_format) in DATE_FORMAT:
        if num == date_format:
            actual_date_format = candidate_format
            break
    else:
        raise ...ValidationError('unsupported choice!')

    # self.cleaned_data['manual_date'] already contains value parsed by "default" date_formats. So we are using raw value instead of it:
    field = self.fields['manual_date']
    field.input_formats = (actual_date_format, )
    raw_value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix('manual_date'))
    value = field.clean(raw_value)
    cleaned_data['manual_date'] = value
    return cleaned_data

【讨论】:

    猜你喜欢
    • 2015-01-15
    • 2011-09-20
    • 2014-04-01
    • 1970-01-01
    • 2016-01-25
    相关资源
    最近更新 更多