Search code examples
jsonajaxpyramiddynatabledeform

Feeding JSON into Dynatable after user submission via Deform (Pyramid)


I'm building a webpage which takes user input and returns a table based on information in my backend. I'm using the web framework Pyramid. My current approach is the following:

  1. Create a Colander Schema and a Deform form object that is rendered using a Chameleon template.

  2. Once the user hits submit, validate the submission and use the input to generate a list of dictionaries.

  3. Encode this result into JSON and feed it to dynatable.js

  4. Display the dynatable below my submission form

Steps 3 and 4 are where I'm having an issue. I don't know what I need to do to expose my list of dictionaries to dynatable. I've read the Pyramid Quick Tutorial, so I have an idea of how to do simple AJAX with a JSON renderer, but I have no idea how to implement this into my current situation.

To give a better idea, my function for processing Deform input is as follows (part of the function and template is adapted from the Deform sample provided on the official Github repo):

@view_config(route_name='query_log', renderer='templates/form.pt') 
def query_log(request):

schema = Device().bind(request=request)

# Create a styled button with some extra Bootstrap 3 CSS classes
process_btn = deform.form.Button(name='process', title="Process")
form = deform.form.Form(schema, buttons=(process_btn,), use_ajax=True)

# User submitted this form
if request.method == "POST":
    if 'process' in request.POST:

        try:
            appstruct = form.validate(request.POST.items())

            # Save form data from appstruct
            print("Enter ID:", appstruct["ID"])
            print("Enter date:", appstruct["date"])

            # This variable is what I want to feed to dynatable
            results = parse_log(appstruct["ID"], appstruct["date"].strftime('%Y-%m-%d'))
            json.dumps(results)

            # Create ppoup
            request.session.flash('Returning Results.')

            # Redirect to the page shows after succesful form submission
            return HTTPFound("/")

        except deform.exception.ValidationFailure as e:
            # Render a form version where errors are visible next to the fields,
            # and the submitted values are posted back
            rendered_form = e.render()
else:
    # Render a form with initial default values
    rendered_form = form.render()

return {
    # This is just rendered HTML in a string
    # and can be embedded in any template language
    "rendered_form": rendered_form,
}

How would I go about passing this results variable via JSON to Dynatable and have the table rendered below the form?


Solution

  • Try baby steps first.

    After validation is successful in your try block:

    try:
        appstruct = form.validate(request.POST.items())
        # following depends on structure of data you need
        results = dict("id" = appstruct["ID"],
                       "date" = appstruct["date"].strftime('%Y-%m-%d'))
        data = json.dumps(results)
        return dict(data=data)
    

    And in the target template, accept the data parameter, rendering to taste.

    Once you have that in place, then you can work on how to pass data via an XHR request, which will depend on your choice of JavaScript library.