newforms v0.10.0 Release Notes

Release Date: 2015-01-04 // over 9 years ago
  • 0๏ธโƒฃ Major features in 0.10 are support for asynchronous validation and new React components for default rendering.

    ๐Ÿ“„ Asynchronous validation (docs)

    clean() and clean<FieldName>() methods can now use asynchronous validation - defining them with a single parameter will let newforms know they will be asynchronous: There is a bunch of new API on Forms, FormSets and BoundFields

    cleanUsername: function(cb) {// ...}
    

    form.validate() now takes an additional callback argument which is required if a Form or FormSet has async validation.

    0๏ธโƒฃ Default rendering now includes a <progress> element on fields, forms and formsets which have pending asynchronous validation.

    ๐Ÿ“„ React components (docs)

    ๐Ÿ†• Newforms now provides RenderForm and RenderFormSet React components for default Form and FormSet rendering:

    \<RenderForm form={MyForm} ref="myForm"/\>
    

    ๐Ÿš€ Default rendering methods on Forms and FormSets (.render(), .asTable(), .asDiv(), .asUl()) are now deprecated and will be removed in the next release.


    ๐Ÿ”„ CHANGES for 0.10.0

    ๐Ÿ’ฅ Breaking Changes

    • โœ‚ Removed formset.asUl() - it never appeared properly due to the management
      Form.
    • formset.cleanedData() to no longer includes cleanedData from incomplete
      extra forms.
    • You can no longer change cleanedData by returning a value from a Form's
      clean<Name>() or clean() method.

    ๐Ÿ†• New Features

    • โž• Added RenderForm, FormRow and RenderFormSet components for default
      rendering.
      • The browser build requires the react-with-addons build of React in order to
        ๐Ÿ‘‰ use RenderForm's custom rendering support.
    • Custom clean() and clean<Field>() validation methods can now be
      specified with the signature (callback) if they need to perform
      asynchronous validation.
      • The callback is an errback with the signature (err, validationError).
      • clean() will not be called until other fields - or just fields it
        ๐Ÿ”ง depends on, if configured - have been cleaned, synchronously or
        asynchronously.
    • form.validate() and formset.validate() now take a callback argument,
      which is required if the Form or Formset has custom async validation
      ๐Ÿ”ง configured - validate() can be used as normal for Form and Formsets
      without async validation.
      • The callback is an errback with the signature (err, isValid, cleanedData).
    • ๐Ÿ†• New API related to async validation:
      • form.isAsync() / formset.isAsync() - true if a form/formset has custom
        async validation.
      • form.isPending() / formset.isPending() - true if a form/formset has
        pending async validation.
      • form.nonFieldPending() / formset.nonFieldPending() - true if async
        validation of a form/formset's clean(cb) method is pending.
      • boundField.isPending() - true if a field has a pending async validation.
      • isFormAsync(Form) - true if a Form constructor's prototype has async
        validation methods.
    • 0๏ธโƒฃ <progress> indicators are now displayed by default rendering methods:
      • Beside fields with pending async validation.
      • At the end of the form when cross-field validation is pending.
    • โž• Added more conditional CSS classes which will be used if defined in a Form:
      • optionalCssClass - used for optional fields
      • pendingCssClass - used for fields with pending async validation
    • โž• Added boundField.helpTextTag() to expose the mechanism for rendering raw
      HTML.
    • โž• Added boundField.status() to get a field's status as a string
      0๏ธโƒฃ (pending/error/valid/default).
    • โž• Added fromJSON() factory functions to ErrorList and ErrorObject
      constructors and fromJSON() instance methods. These can be used to rehydrate
      an ErrorObject on the receiving end when form.errors() is transferred as
      JSON. This assumes the structure created by these objects' toJSON() methods.
    • โž• Added form.setErrors() to set an ErrorObject with errors from another
      source.
    • An ErrorObject can now be passed as an errors option when creating a form
      instance, to redisplay a form with errors from another source. This prevents
      the form's own validation from running if the form has input data and
      isValid() or errors() are called during rendering.

    ๐Ÿ—„ Deprecations

    • Form rendering methods (render(), asTable(), asDiv() and asUl()) are
      ๐Ÿ—„ deprecated in favour of using React components for rendering - RenderForm
      0๏ธโƒฃ now provides default rendering.
    • FormSet rendering methods (render(), asTable() and asDiv()) are
      ๐Ÿ—„ deprecated in favour of using React components for rendering - RenderFormSet
      0๏ธโƒฃ now provides default rendering.

    ๐Ÿ”„ Changes

    • ๐Ÿ”€ Reverted a change from 0.9. Synchronous calls to form/formset.validate()
      โšก๏ธ will trigger a re-render, as it looks like forceUpdate() just enqueues a
      future re-render.
    • form.isComplete() is now false if there is any pending async validation,
      even if all required fields currently have cleaned data.
    • ๐Ÿ”„ Changes to when event-based validation fires:
      • Validation now only fires if the field's data has changed since it was last
        0๏ธโƒฃ validated. For 'auto' validation, this prevents the default onBlur
        0๏ธโƒฃ event from re-running the same validation as the default onChange.
      • Special cases for onBlur:
      • Pending validation is triggered immediately.
      • Validation is always triggered if the field is required and empty.
    • ๐Ÿ”„ Changed form.addError() to no longer add duplicate error messages for the
      same field. This can happen if onChange validation which runs repeatedly
      โž• adds errors to a field other than that which triggered the validation, using
      addError().
    • 0๏ธโƒฃ The default rows attribute for a Textarea changed from 10 to 3.
    • Error messages now make use of a displayName property if a Form has one.

    Removals

    • ๐Ÿ—„ The deprecated onStateChange argument to Form and FormSet constructors has
      ๐Ÿšš been removed - use onChange instead.