When using a custom multiform widget for time in a modelform, if that
modelform represents the 'extra' item in an inlineformset The
has_changed method always returns true on post even if the 'extra'
item was not changed. In the debugger the changed_data attribute shows
the fields with the custom widget. Comparing the values before  and
after the post show that they are identical and have in fact not
changed. This causes a failure in validation when existing items in
the formset are changed and a new item should not be added. When using
the default widget for time entry the the behavior is exactly as I
would expect it (the extra item does not appear changed unless i
change it). Is there a method in the widget or the field I need to
overload to make this properly handle the change value comparison when
a post occurrs?




from my forms.py:

  class TimeSelectField(MultiValueField):
    def __init__(self, *args, **kwargs):
        fields = (
                  forms.ChoiceField(choices=HOUR_CHOICES),
                  forms.ChoiceField(choices=MINUTE_CHOICES)
                  )
        super(TimeSelectField, self).__init__(fields, *args,
**kwargs)

    def compress(self, data_list):
        if data_list is not None:
            return time(hour=int(data_list[0]),
minute=int(data_list[1]))
        return time(hour=0, minute=0)

class TimeSelectWidget(MultiWidget):
    def __init__(self, *args, **kwargs):
        widgets = (
                   forms.Select(choices=HOUR_CHOICES),
                   forms.Select(choices=MINUTE_CHOICES)
                   )
        super(TimeSelectWidget, self).__init__(widgets, *args,
**kwargs)

    def decompress(self, value):
        if value is not None:
            return [str(value.hour).zfill(2),
str(value.minute).zfill(2)]
        return ['00', '00']

    def format_output(self, rendered_widgets):
        return u'\n'.join(rendered_widgets)

class ScheduleEntryForm(forms.ModelForm):
    start_time = TimeSelectField(widget=TimeSelectWidget)
    end_time = TimeSelectField(widget=TimeSelectWidget)
    class Meta:
        model = ScheduleEntry

ScheduleEntryFormset = inlineformset_factory(Schedule, ScheduleEntry,
can_delete=True, extra=1, form=ScheduleEntryForm )

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to