================================
Generic contact forms for Django
================================


Providing some sort of contact or feedback form for soliciting
information from site visitors is a common need in web development,
and writing a contact form and associated handler view, while
relatively straightforward to do with Django, can be a tedious and
repetitive task. This application aims to remove or reduce that tedium
and repetition by providing generic contact-form functionality.


Requirements
============

This application makes heavy use of Django's newforms library, and was
written *after* a backwards-incompatible change on Django trunk
altered the way newforms stores valid data; as a result, this
application requires a Subversion checkout of Django, revision 5237 or
later.

Because a recent trunk checkout of Django was already required, the
default ``urls.py`` supplied with this application also takes
advantage of named URL patterns, a feature which was not present in
the Django 0.96 release.

If you will be using the included ``AkismetContactForm`` class, which
performs an Akismet spam check as part of its validation, you will
need the `Python Akismet module`_ and a valid Akismet API key; you can
obtain an Akismet API by following the instructions at `the Akismet
web site`_.

.. _Python Akismet module: http://www.voidspace.org.uk/python/modules.shtml#akismet
.. _the Akismet web site: http://akismet.com/


High-level overview
===================

This application contains a (newforms) form class called
``ContactForm``, which implements a useful baseline for contact forms
-- collecting a name, email address and message, and emailing them to
site staff -- and which is also designed so as to allow additional
functionality to be added easily in subclasses. For specifics of how
``ContactForm`` works and what to look at when subclassing it, see the
`forms documentation`_ included with this application.

Also provided is a generic-style view called ``contact_form``, which
is designed to work out-of-the-box with ``ContactForm`` and subclasses
of ``ContactForm``, and has a number of configurable parameters to
allow specification of the form class to use, whether to require a
user to log in before using the form, etc. For full details on this
view and the options it provides, see the `views_documentation`_
included with this application.

A sample URLConf is included, and can be used "as-is" if the default
``ContactForm`` and default parameters of the ``contact_form`` view
are all that's required, or studied as an example.

.. _forms documentation: forms.html
.. _views documentation: views.html


Basic usage
===========

To get up and running immediately using the default setup, do the
following:

    * Add ``contact_form`` to your project's ``INSTALLED_APPS``
      setting. You will *not* need to run ``manage.py syncdb``, since
      this application provides no models.

    * In your root URLConf, add the following URL pattern::
          
          (r'^contact/', include('contact_form.urls'),
    
    * Create four templates: ``contact_form/contact_form_subject.txt``
      and ``contact_form/contact_form.txt``, which will be used to
      render the email messages sent by the form;
      ``contact_form/contact_form.html``, which will be used to
      display the form to users; and
      ``contact_form/contact_form_sent.html``, which will be used
      after the form is successfully submitted.  See the forms and
      views documentation, respectively, for details on the contexts
      available to the first three templates; the fourth is rendered
      from the ``direct_to_template`` generic view, and has no
      context.

Once this is done, visiting the URL ``/contact/`` on your site will
display the contact form, and submitting it will send an email to each
address in the ``MANAGERS`` setting for your project.
