user2161650
user2161650

Reputation:

Django date format issue

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, )

The class SettingsForm is used to save two input formats into a table. It saves an int value "1" for the %m/%d/%Y format and "0" for the %d/%m/%Y format.

If the input format is %m/%d/%Y, then on form POST, the value of the date is somehow changed and saved into the database like this: if the given date is 07/06/2013 (June, 7th 2013), it is saved in the database as 06/07/2013 (July, 6th 2013). Thus, not saving the desired and correct date.

It does works fine if the selected format is %d/%m/%Y.

Upvotes: 3

Views: 674

Answers (2)

Wilston
Wilston

Reputation: 136

Try this,

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

I had made some small changes in your code,I guess it will solve your issue.

Cheers

Upvotes: 1

imposeren
imposeren

Reputation: 4392

In SettingsForm.__init__ your date_format is just '1' or '0'. But you should get real format. Also you should get date_format from cleaned_data and not from init args:

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

Upvotes: 1

Related Questions