Opened 11 years ago

Closed 10 years ago

Last modified 10 years ago

#22208 closed Uncategorized (invalid)

Weird SplitDateTime widget Behaviour regarding initial data between bound & unbound forms

Reported by: Ramezashraf@… Owned by: nobody
Component: Forms Version: 1.6
Severity: Normal Keywords: SplitDateTimeWidget, ModelForms
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: yes UI/UX: no

Description

I need to send initial date & time to a SplitDateTime widget in a model form

an example:

models.py

class Event(models.Model):
    event_name = models.CharField(max_length = 250)
    start_date = models.DateTimeField(db_index = True, )
    end_date = models.DateTimeField(db_index = True)

forms.py

class add_event (forms.ModelForm):
    start_date = forms.SplitDateTimeField(input_time_formats=['%I:%M %p'], widget=forms.SplitDateTimeWidget(date_format='%Y-%m-%d', time_format='%I:%M %p'))
    end_date = forms.SplitDateTimeField(input_time_formats=['%I:%M %p'], widget=forms.SplitDateTimeWidget(date_format='%Y-%m-%d', time_format='%I:%M %p'))

views.py

import datetime as dt
def myview(request):
    data={}
    data['event_name'] = 'Awesome Event'
    data['start_date'] = dt.datetime.now

    #Now i send the 'initial' data to form , I Tried the following:
    form = add_event(initial=data) #1st: Works fine,everything is populated as expected, But i get an unbound form , with no validation
    form = add_event(data)  # 2nd: event_name field is populated right but the SplitDatetime widget is not, (come out as an Empty widget)
    form = add_event(data=data) #3rd: Same as previous , Event_name field is populated right but the SplitDatetime widget is not

However , removing the splitDatetimeWidget from the add_event fields definition , would make the 3rd solution working & everything is populated fine
But results of a combined text field with both the date & time.

Searched over the internet , tried every solution , none seem to work , although i know there is some way of doing it , or else , CBV updating an event would contains empty SplitDateTime value as well. but i can't find the solution or deeper diagnose the problem.

What is missing here?
Perhaps this can be added to documentation. (If it's not already there and i didn't see it)

Thank you so much !!

Best regards;

Change History (2)

comment:1 by Ramezashraf@…, 11 years ago

I also tried adding time zone , sending the date in sting , in list .. none seem to work with parameter 'data'
Yet the same dictionary sent to the form with initial argument (instead of data) works like a charm

The only problem persist in SplitDatetime , other widgets/field are populated as expected

am i missing something here or is it a bug ?!

comment:2 by gabrielbrasil, 10 years ago

Resolution: invalid
Status: newclosed

Hi Ramezashraf,

Next time, please use Django's support channels instead of creating a ticket. You will get much faster support for issues like these.
https://code.djangoproject.com/wiki/TicketClosingReasons/UseSupportChannels

This is not a bug. A couple points:
1) Running "form = add_event(data=data)" and "form = add_event(data)" is the same.
2) The "initial" and "data" arguments are different: initial should receive values to be used when first rendering the form, and the data is not validated. "data" argument is used with the data that came from a submitted form. When the form is submitted, the date and time are split like this:

    data['start_date_0'] = '2014-04-15'
    data['start_date_1'] = '07:33 PM'
    form = add_event(data=data)

This does work as expected. But for your case, you do want to pass that dictionary to "initial".

If you have further questions, please use the link above to get help with Django.

Last edited 10 years ago by gabrielbrasil (previous) (diff)
Note: See TracTickets for help on using tickets.
Back to Top