What’s New In FormEncode 0 to 1.2.4


  • Fix packaging issue with i18n files (from Juliusz Gonera)



  • Added keyword argument force_defaults to formencode.htmlfill.render(); when this is True (the default) this will uncheck checkboxes, unselect select boxes, etc., when a value is missing from the default dictionary.

  • Updated German translation


  • Be more careful about unicode(Invalid(...)), to make sure it always returns unicode.

  • Fix broken formencode.national zip code validators.

  • In formencode.national only warn about the pycountry or TG requirement when creating validators that require them.

  • Fix another formencode.htmlfill error due to a field with no explicit value.


  • Added formencode.validators.IPAddress, validating IP addresses, from Leandro Lucarella.

  • Added method Invalid.__unicode__

  • In formencode.htmlfill use a default encoding of utf8 when handling mixed str/unicode content. Also do not modify <input type="image"> tags (previously src would be overwritten, for no good reason).

  • In formencode.validators.Email allow single-character domain names (like x.com).

  • Make formencode.validators.FieldsMatch give a normal Invalid exception if you pass it a non-dictionary. Also treat all missing keys as the empty string (previously the first key was required and would raise KeyError).

  • formencode.validators.Number works with inf float values (before it would raise a OverflowError).

  • The tw locale has been renamed to the more standard zh_TW.

  • Added Japanese and Turkish translations.

  • Fixed some outdated translations and errors in Spanish and Greek translations. Translations now managed with Babel.


  • Fixed the is_empty() method in formencode.validators.FieldStorageUploadConverter; previously it returned the opposite of the intended result.

  • Added a parameter to htmlfill.render(): prefix_error. If this parameter is true (the default) then errors automatically go before the input field; if false then they go after the input field.

  • Remove deprecated modules: fields, formgen, htmlform, sqlformgen, and sqlschema.

  • Added formencode.htmlrename, which renames HTML inputs.

  • In formencode.htmlfill, non-string values are compared usefully (e.g., a select box with integer values).

  • The validators Int and Number both take min/max arguments (from Shannon Behrens).

  • Validators based on formencode.validators.FormValidator will not treat {} as an empty (unvalidated) value.

  • Some adjustments to the URL validator.

  • formencode.compound.All does not handle empty values, instead relying on sub-validators to check for emptiness.

  • Fixed the if_missing attribute in formencode.foreach.ForEach; previously it would be the same list instance, so if you modified it then it would effect future if_missing values (reported by Felix Schwarz).

  • Added formatter to formencode.htmlfill, so you can use <form:error name="field_name" formatter="ignore" /> – this will cause the error to be swallowed, not shown to the user.

  • Added formencode.validators.XRI for validation i-names, i-numbers, URLs, etc (as used in OpenID).

  • Look in /usr/share/locale for locale files, in addition to the normal locations.

  • Quiet Python 2.6 deprecation warnings.

  • Fix formencode.validators.URL, which was accepting illegal characters (like newlines) and did not accept http://domain:PORT/


  • chained_validators were removed from Schema somehow; now replaced and working.

  • Put in missing htmlfill.render(error_class=...) parameter (was documented and implemented, but render() did not pass it through).


  • Added formencode.schema.SimpleFormValidator, which wraps a simple function to make it a validator.

  • Changed the use of chained_validators in Schemas, so that all chained validators get run even when there are previous errors (to detect all the errors).

  • While something like Int.to_python() worked, other methods like Int.message(...) didn’t work. Now it does.

  • Added Italian, Finnish, and Norwegian translations.


Backward incompatible changes

  • The notion of “empty” has changed to include empty lists, dictionaries, and tuples. If you get one of these values passed into (or generated by) a validator with not_empty=True you can get exceptions where you didn’t previously.


  • Added support for Paste’s MultiDict dictionary as input to Schema.to_python, by converting it to a normal dict via MultiDict.mixed. Previously MultiDicts wouldn’t work with CompoundValidators (like ForEach)

  • Added encoding parameter to htmlfill, which will handle cases when mixed str and unicode objects are used (turning all str objects into unicode)

  • Include formencode.validators.InternationalPhoneNumber from W-Mark Kubacki.

  • validators.Int takes min and max options (from Felix Schwarz).

  • You can control the missing message (which by default is just “Missing Value”) using the message "missing" in a validator (also from James Gardner).

  • Added validators.CADR (for IP addresses with an optional range) and validators.MACAddress (from Christoph Haas).

Bug Fixes

  • Be friendlier when loaded from a zip file (as with py2exe); previously only egg zip files would work.

  • Fixed bug in htmlfill when a document ends with no trailing text after the last tag.

  • Fix problem with HTMLParser’s default unescaping routing, which only understood a very limited number of entities in attribute values.

  • Fix problem with looking up A records for email addresses.

  • validators.String now always returns strings. It also converts lists to comma-separated strings (no [...]), and can encode unicode if an encoding parameter is given. Empty values are handled better.

  • validators.UnicodeString properly handles non-Unicode inputs.

  • Make validators.DateConverter serialize dates properly (from James Gardner).

  • Minor fix to setup.py to make FormEncode more friendly with zc.buildout.


  • Set if_missing=() on validators.Set, as a missing value usually means empty for this value.

  • Fix for Email validator that searches A records in addition to MX records (from Jacob Smullyan).

  • Fixes for the es locale.


  • Backward compatibility issue: Due to the addition of i18n (internationalization) to FormEncode, Invalid exceptions now have unicode messages. You may encounter unicode-related errors if you are mixing these messages with non-ASCII str strings.

  • gettext-enabled branch merged in

  • Fixes #1457145: Fails on URLs with port numbers

  • Fixes #1559918 Schema fails to accept unicode errors

  • from formencode.validators import * will import the Invalid exception now.

  • Invalid().unpack_errors(encode_variables=True) now filters out None values (which ForEach can produce even for keys with no errors).


  • String(min=1) implies not_empty (which seems more intuitive)

  • Added list_char and dict_char arguments to Invalid.unpack_errors (passed through to variable_encode)

  • Added a use_datetime option to TimeValidator, which will cause it to use datetime.time objects instead of tuples. It was previously able to consume but not produce these objects.

  • Added <form:iferror name="not field_name"> when you want to include text only when a field has no errors.

  • There was a problem installing 0.5.1 on Windows with Python 2.5, now resolved.


  • Fixed compound validators and not_empty (was breaking SQLObject’s PickleCol)


  • Added htmlfill.default_formatter_dict, and you can poke new formatters in there to effective register them.

  • Added an escapenl formatter (nl=newline) that escapes HTML and turns newlines into <br>.

  • When not_empty=False, empty is assumed to be allowed. Thus Int().to_python(None) will now return None.


  • Fixed up all the documentation.

  • Validator __doc__ attributes will include some automatically-appended information about all the message strings that validator uses.

  • Deprecated formencode.htmlform module, because it is dumb.

  • Added an .all_messages() method to all validators, primarily intended to be used for documentation purposes.

  • Changed preferred name of StringBoolean to StringBool (to go with bool and validators.Bool). Old alias still available.

  • Added today_or_after option to validators.DateValidator.

  • Added a validators.FileUploadKeeper validator for helping with file uploads in failed forms. It still requires some annoying fiddling to make work, though, since file upload fields are so weird.

  • Added text_as_default option to htmlfill. This treats all <input type="something-weird"> elements as text fields. WHAT-WG adds weird input types, which can usually be usefully treated as text fields.

  • Make all validators accept empty values if not_empty is False (the default). “Empty” means "" or None, and will generally be converted None.

  • Added accept_python boolean to all FancyValidator validators (which is most validators). This is a fixed version of the broken validate_python boolean added in 0.3. Also, it defaults to true, which means that all validators will not validate during .from_python() calls by default.

  • Added htmlfill.render(form, defaults, errors) for easier rendering of forms.

  • Errors automatically inserted by htmlfill will go at the top of the form if there’s no field associated with the error (raised an error in 0.3).

  • Added formencode.sqlschema for wrapping SQLObject classes/instances. See the docstring for more.

  • Added ignore_key_missing to Schema objects, which ignore missing keys (where fields are present) when no if_missing is provided for the field.

  • Renamed validators.StateProvince.extraStates to extra_states, to normalize style.


  • When checking destinations, validators.URL now allows redirect codes, and catches socket errors and turns them into proper errors.

  • Fix typo in htmlfill

  • Made URL and email regular expressions a little more lax/correct.

  • A bunch of fixes to validators.SignedString, which apparently was completely broken.


  • Allow errors to be inserted automatically into a form when using formencode.htmlfill, when a <form:error> tag isn’t found for an error.

  • Added if_key_missing attribute to schema.Schema, which will fill in any keys that are missing and pass them to the validator.

  • FancyValidator has changed, adding if_invalid_python and validate_python options (which also apply to all subclasses). Also if_empty only applies to to_python conversions.

  • FancyValidator now has a strip option, which if true and if input is a string, will strip whitespace from the string.

  • Allow chained validators to validate otherwise-invalid forms, if they define a validate_partial method. The credit card validator does this.

  • Handle FieldStorage input (from file uploads); added a formencode.fieldstorage module to wrap those instances in something a bit nicer. Added validators.FieldStorageUploadConverter to make this conversion.

  • Added StringBoolean converter, which converts strings like "true" to Python booleans.


  • A couple fixes to DateConverter, FieldsMatch, StringBoolean, CreditCardValidator.

  • Added missing Validator.assert_string method.

  • formencode.htmlfill_schemabuilder handles checkboxes better.

  • Be a little more careful about how Invalid exceptions are created (catch some errors sooner).

  • Improved handling of non-string input in htmlfill.


  • Some experimental work in formencode.formgen. Experimental, I say!

  • Added an experimental formencode.context module for dynamically-scoped variables.