+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.