+1 on a loud exception being raised.

"Errors should never pass silently.
Unless explicitly silenced."


Cheers,
AT


On Wed, Jan 11, 2012 at 1:29 PM, Daniel Sokolowski <
daniel.sokolow...@klinsight.com> wrote:

> +1 even though I agree with what Babatunde said I support this change as
> anything that minimizes a 'gotchas' during development is very good. I
> raether get an exception instead of spending half an hour debuging why my
> data is not being saved. Sure once I figure it out I would learn to pay
> attention in similar situations in the future but realistically I shouldn't
> and nor should the next python/django programmer re-discovering this caveat.
>
> On Wed, Jan 11, 2012 at 9:11 AM, Babatunde Akinyanmi <tundeba...@gmail.com
> > wrote:
>
>> -1
>> I think a programmer should not specify a field that would contain
>> important data as optional in the first place. If the data loss from
>> not including it in the form is going to cause problems then it should
>> not be optional.
>>
>> On 1/11/12, Tai Lee <real.hu...@mrmachine.net> wrote:
>> > There is a potential for data loss with optional form fields that are
>> > (for whatever reason) omitted from an HTML template.
>> >
>> > For example, if we take an existing model form and template that
>> > works, add an optional character field to the model but fail to add a
>> > corresponding field to the HTML template (e.g. human error, forgot
>> > about a template, didn't tell the template author to make a change,
>> > didn't realise a change needed to be made to a template), when that
>> > form is submitted Django will assume that the user has provided an
>> > empty string value for the missing field and save that to the model,
>> > erasing any existing value. This is not a bug, but it is relatively
>> > easy to trigger silent and unexpected data loss.
>> >
>> > I have briefly discussed this with PaulM and dstufft on django-dev,
>> > but could did not reach any consensus.
>> >
>> > RFC1866 [1] says:
>> >
>> >> The fields are listed in the order they appear in the
>> >> document with the name separated from the value by `=' and
>> >> the pairs separated from each other by `&'. Fields with null
>> >> values may be omitted. In particular, unselected radio
>> >> buttons and checkboxes should not appear in the encoded
>> >> data, but hidden fields with VALUE attributes present
>> >> should.
>> >
>> > The HTML4 spec at W3C.org [2] says:
>> >
>> >> Users interact with forms through named controls.
>> >>
>> >> A control's "control name" is given by its name attribute. The scope of
>> >> the
>> >> name attribute for a control within a FORM element is the FORM element.
>> >>
>> >> Each control has both an initial value and a current value, both of
>> which
>> >> are
>> >> character strings. Please consult the definition of each control for
>> >> information about initial values and possible constraints on values
>> >> imposed by
>> >> the control. In general, a control's "initial value" may be specified
>> with
>> >> the
>> >> control element's value attribute. However, the initial value of a
>> >> TEXTAREA
>> >> element is given by its contents, and the initial value of an OBJECT
>> >> element
>> >> in a form is determined by the object implementation (i.e., it lies
>> >> outside
>> >> the scope of this specification).
>> >>
>> >> The control's "current value" is first set to the initial value.
>> >> Thereafter,
>> >> the control's current value may be modified through user interaction
>> and
>> >> scripts.
>> >>
>> >> A control's initial value does not change. Thus, when a form is reset,
>> >> each
>> >> control's current value is reset to its initial value. If a control
>> does
>> >> not
>> >> have an initial value, the effect of a form reset on that control is
>> >> undefined.
>> >>
>> >> When a form is submitted for processing, some controls have their name
>> >> paired
>> >> with their current value and these pairs are submitted with the form.
>> >> Those
>> >> controls for which name/value pairs are submitted are called successful
>> >> controls.
>> >
>> > as well as [3]:
>> >
>> >> A successful control is "valid" for submission. Every successful
>> control
>> >> has
>> >> its control name paired with its current value as part of the submitted
>> >> form
>> >> data set. A successful control must be defined within a FORM element
>> and
>> >> must
>> >> have a control name.
>> >>
>> >> However:
>> >>
>> >> * Controls that are disabled cannot be successful.
>> >> * If a form contains more than one submit button, only the activated
>> >> submit
>> >>   button is successful.
>> >> * All "on" checkboxes may be successful.
>> >> * For radio buttons that share the same value of the name attribute,
>> only
>> >> the
>> >>   "on" radio button may be successful.
>> >> * For menus, the control name is provided by a SELECT element and
>> values
>> >> are
>> >>   provided by OPTION elements. Only selected options may be successful.
>> >> When
>> >>   no options are selected, the control is not successful and neither
>> the
>> >> name
>> >>   nor any values are submitted to the server when the form is
>> submitted.
>> >> * The current value of a file select is a list of one or more file
>> names.
>> >> Upon
>> >>   submission of the form, the contents of each file are submitted with
>> the
>> >>   rest of the form data. The file contents are packaged according to
>> the
>> >>   form's content type.
>> >> * The current value of an object control is determined by the object's
>> >>   implementation.
>> >>
>> >> If a control doesn't have a current value when the form is submitted,
>> user
>> >> agents are not required to treat it as a successful control.
>> >>
>> >> Furthermore, user agents should not consider the following controls
>> >> successful:
>> >>
>> >> * Reset buttons.
>> >> * OBJECT elements whose declare attribute has been set.
>> >>
>> >> Hidden controls and controls that are not rendered because of style
>> sheet
>> >> settings may still be successful.
>> >
>> > I interpret the above to mean that any text input with a value
>> > attribute (even `value=""`) is successful control, and should be
>> > included in the encoded form data. This is what current versions of
>> > Chrome and Firefox do, at least. I have not found any examples of
>> > browsers which are known not to do this.
>> >
>> > What I would like to change in Django is for it to stop assuming that
>> > missing POST data for a character field is actually an empty string,
>> > and instead raise a form validation error that would prevent the model
>> > instance from being saved to the database (potentially causing data
>> > loss for that field).
>> >
>> > I don't see any benefit in the current behaviour, except to
>> > potentially support undetermined and unspecified UAs which might treat
>> > form fields as unsuccessful controls if the have an empty string as
>> > their value, and if those UAs accordingly do not include those fields
>> > in the encoded form data. Even if such UAs were found, I would argue
>> > that the RFC and HTML4 specs show that text fields with a value (even
>> > an empty string) are successful controls that should be included.
>> >
>> > Failing that, I would like for Django to at least raise a loud warning
>> > when a form is bound to data is missing values for character fields,
>> > so that it will at least be easier to detect this silent and
>> > unexpected data loss in a test environment, before it occurs in a
>> > production environment.
>> >
>> > Does anybody else have opposing or supporting arguments, or any
>> > knowledge of actual UAs that do not include fields with empty values
>> > in their encoded form data, or an alternative interpretation of the
>> > RFC and HTML4 specs above?
>> >
>> > Cheers.
>> > Tai.
>> >
>> > [1] http://www.rfc-editor.org/rfc/rfc1866.txt
>> > [2] http://www.w3.org/TR/html4/interact/forms.html#h-17.2
>> > [3] http://www.w3.org/TR/html4/interact/forms.html#successful-controls
>> >
>> > --
>> > You received this message because you are subscribed to the Google
>> Groups
>> > "Django developers" group.
>> > To post to this group, send email to django-developers@googlegroups.com
>> .
>> > To unsubscribe from this group, send email to
>> > django-developers+unsubscr...@googlegroups.com.
>> > For more options, visit this group at
>> > http://groups.google.com/group/django-developers?hl=en.
>> >
>> >
>>
>> --
>> Sent from my mobile device
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Django developers" group.
>> To post to this group, send email to django-developers@googlegroups.com.
>> To unsubscribe from this group, send email to
>> django-developers+unsubscr...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/django-developers?hl=en.
>>
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "Django developers" group.
> To post to this group, send email to django-developers@googlegroups.com.
> To unsubscribe from this group, send email to
> django-developers+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/django-developers?hl=en.
>

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

Reply via email to