class JoinManipulator(forms.Manipulator): def __init__(self): self.fields = ( forms.TextField(field_name="name", is_required=True, maxlength=100), forms.TextField(field_name="business_name", is_required=True, maxlength=40), forms.IntegerField(field_name="telephone", is_required=True, length=40, maxlength=50), forms.EmailField(field_name="email", is_required=True), forms.SelectField(field_name="countries", is_required=True, choices=countries), forms.CheckboxField(field_name="sms_enable"), forms.LargeTextField(field_name="message", is_required=True), ) def save(self, new_data): from someapp.models import Place new_place = Place(**new_data) return new_place def join(request): manipulator =JoinManipulator() if request.method == 'POST': # If data was POSTed, we're trying to create a new Customer. new_data = request.POST.copy() # Check for errors. errors = manipulator.get_validation_errors(new_data) manipulator.do_html2python(new_data) if not errors: # No errors. This means we can save the data! # new_place = manipulator.save(new_data) # Redirect to the object's "edit" page. Always use a redirect # after POST data, so that reloads don't accidently create # duplicate entires, and so users don't see the confusing # "Repost POST data?" alert box in their browsers. return HttpResponseRedirect("/places/edit/%i/" % new_place.id) else: # No POST, so we want a brand new form without any data or errors. errors = new_data = {} # Create the FormWrapper, template, context, response. form = forms.FormWrapper(manipulator, new_data, errors) return render_to_response('join.html', {'form': form})