== Overview ==

    This contrib app has two aspects:
    1.  Quick Manipulators
    2.  Quick Forms


== Quick Manipulators ==
    
    These manipulators ease the creation of custom manipulation.
    A detailed explination is available at <http://code.djangoproject.com/wiki/CookBookManipulatorCustomManipulator>.
    Usage breaks down to defining your class, like so:
        from django.contrib.quickforms.manipulators import *
        // django.forms is included in that * above.
    
        class PollEdit(Manipulator):
            # Provide the fields.
            fields = (
                forms.TextField("title", maxlength=32, is_required=True),
                forms.TextField("question", maxlength=128, is_required=True),
            )
        
            def __init__(self, poll):
                # We could also provide our fields here, which is usefull if you have
                # custom validators that you need to reference off of "self."
        
                # Save a reference to our poll.
                self.poll = poll
        
                # Set our default dictionary to match our poll object.
                # That way the data populating the fields will match our current poll.
                self.default = poll.__dict__
                
            def complete(self, request, data):
                # This is executed after the user submits valid data.
        
                # Set the poll's title to the user-submited 'title' in our data.
                self.poll.title = data['title']
        
                # Same with 'question'
                self.poll.question = data['question']
        
                # Don't forget to save.
                self.poll.save()

    And using them in the view like so:
        def edit_poll(request, id):
            poll = get_object_or_404(Poll, pk=id)  # Get our poll object.
            manipulator = PollEdit(poll)    # Create the manipulator.
            manipulator.process(request)    # Process the request.
            if (manipulator.form):          # If we are done, redirect to the poll view page.
                return render_to_response('polls/edit_form', {'form': manipulator.form})
            else:                           # Otherwise, we render the form.
                return HttpResponseRedirect("/polls/%d" % poll.id)
    
== Quick Forms ==
    Quick forms will spray down a form real quick.  Remember to {% load quickforms %} at the top of any template
    you are building to gain the functionality.
    
    There are two tags that are given with the quickforms app:
        {% quickform form %} 
        and 
        {% quickform-row form.row %}
        
    In your view, if you used a quick manipulator, you should add the form to your context as in the line above:
        return render_to_response('polls/edit_form', {'form': manipulator.form})
    
    Then you can use it in your template thusly:
        <form action='.' method='post'>
            {% quickform form %}
        </form>
    
    Tips:
        * The quickform-row will render only a row, instead of the whole table.
        * The table layout gives classes for most every element, giving you very good control via css.
        * If you assign a .label attribute to a form item, that string will be used for the label.
    