Web forms handling library for Common lisp
Switch branches/tags
Nothing to show
Clone or download
Latest commit cf1815e Jun 7, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
src Type annotations Jun 7, 2018
test Disabled and readonly fields Sep 14, 2017
.gitignore Commit bower components Jan 22, 2015
README.md Update README.md Jul 8, 2017
cl-forms.asd Don't use parenscript Aug 28, 2017
cl-forms.demo.asd Form templates demo Jul 25, 2017
cl-forms.djula.asd Update ASDF descriptions Jul 7, 2017
cl-forms.qimt.asd Directories restructuring Oct 17, 2014
cl-forms.test.asd Update ASDF descriptions Jul 7, 2017
cl-forms.who.asd Housekeeping Jul 8, 2017



CL-FORMS is a web forms handling library for Common Lisp.

Although it is potentially framework agnostic, it runs on top of Hunchentoot at the moment.

It features:

  • Several form field types: String, boolean, integer, email, password fields. And more.
  • Custom fields. CL-FORMS is extensible and it is possible to define new field types.
  • Server and client side validation
  • Rendering backends. Forms can be rendered via CL-WHO, or Djula, or something else; the backend is pluggable. The default renderer is CL-WHO.
  • Themes (like Bootstrap)
  • Control on rendering and layout.
  • Handling of form errors.
  • CSRF protection


Use defform to define a form. Example:

(defform fields-form (:action "/fields-post")
  ((name :string :value "")
   (ready :boolean :value t)
   (sex :choice :choices (list "Male" "Female") :value "Male")
   (submit :submit :label "Create")))

On your web handler, grab the form via get-form, select a renderer with with-form-rendererand then render the form with render-form:

(let ((form (forms::get-form 'fields-form)))
   (forms:with-form-renderer :who
      (forms:render-form form))

To handle the form, grab it via get-form and then call handle-request (you should probably also call validate-form after). Then bind form fields via either with-form-field-values, that binds the form field values; or with-form-fields that binds the form fields.

(let ((form (forms:get-form 'fields-form)))
    (forms::handle-request form)
    (forms::with-form-field-values (name ready sex) form
       (who:with-html-output (forms.who::*html*)
            (:li (who:fmt "Name: ~A" name))
            (:li (who:fmt "Ready: ~A" ready))
            (:li (who:fmt "Sex: ~A" sex))))))

Plase have a look at the demo sources for more examples of how to use the library


There's a demo included. To run:

Download web assets. From /test/static directory run:

bower install

and then:

(require :cl-forms.demo)