AJAX form submission (redirect on success)

  • Mapping

Captured

None

Code (show in context)

    @view_config(renderer='templates/form.pt', name='ajaxform_redirect')
    @demonstrate('AJAX form submission (redirect on success)')
    def ajaxform_redirect(self):
        class Mapping(colander.Schema):
            name = colander.SchemaNode(
                colander.String(),
                description='Content name')
            date = colander.SchemaNode(
                colander.Date(),
                widget=deform.widget.DatePartsWidget(),
                description='Content date')
        class Schema(colander.Schema):
            number = colander.SchemaNode(
                colander.Integer())
            mapping = Mapping()
        schema = Schema()
        options = """
        {success:
          function (rText, sText, xhr, form) {
            var loc = xhr.getResponseHeader('X-Relocate');
            if (loc) {
              document.location = loc;
            };
           }
        }
        """
        def succeed():
            location = self.request.application_url + '/thanks.html'
            # To appease jquery 1.6+, we need to return something that smells
            # like HTML, or we get a "Node cannot be inserted at the
            # specified point in the hierarchy" Javascript error.  This didn't
            # used to be required under JQuery 1.4.
            return Response(
                '<div>hurr</div>',
                headers=[('X-Relocate', location), ('Content-Type','text/html')]
                )
        form = deform.Form(schema, buttons=('submit',), use_ajax=True,
                           ajax_options=options)
        return self.render_form(form, success=succeed)