Search code examples
pythonformssessionjinja2pyramid

Python Pyramid - Use session to pass form data to another page


I'm using Python Pyramid with Jinja2 template. I want to save my form data into session and retrieve it in another HTML page. How should I change in order to pass the data? I only know how to store the data I key in Views.py into session like this request.session['postal'] = 01934 but this is not the data I key in Delivery.jinja2. And if I used print (session['postal']), this will only show in my command prompt but not HTML page. Can anyone help me out? I'm a beginner to this.

What to add in/ change in my Views.py?

my HTML: Delivery.jinja2

<form class="form-horizontal" method="POST">   
<div class="form-group">
    <label class="control-label col-md-2" for="postal">Postal Code:</label>
        <input type="text" class="form-control" id="postal" placeholder="Enter Postal Code" name="postal" />
</div>
<div class="form-group">
    <label class="control-label col-md-2" for="address">Detailed Address:</label>
        <textarea class="form-control" rows="3" id="address" placeholder="Enter Address" name="address"></textarea>
</div>
<div class="form-group">
    <label class="control-label col-md-2" for="unit">Unit No #:</label>
        <input type="text" class="form-control" id="unit" placeholder="Enter Unit No" name="unit" />
</div>
<button type="submit" class="btn btn-default" name="submit">Submit</button>
</form>

Views.py

@view_config(route_name='deliveryLink', renderer='templates/deliveryLink.jinja2')
def deliveryLink(request):
    print("YAY for gift delivery via Link")

if 'submit_deliverylink' in request.POST:
    print("request.POST: ", request.POST)

    myform = request.POST

    for m in myform:
        print("key: ", m, " value: ", myform[m])

    session = request.session

    session['postal'] = ?
    session['address'] = ?
    session['unit'] = ?

    data = "??"

    data_array = data.split(",")
    session['data'] = data_array

    session['delivery'] = str(data_array)

    print (session['delivery'])

    return HTTPFound(location='http://localhost:5555/confirmation')
return {}

@view_config(route_name='confirmation', renderer='templates/confirmation.jinja2')
def confirmation(request):
    print("YAY for confirmation")

        for a in request.POST:
            request.session[a] = request.POST[a]

    return {}

and I want the data entered previously to show on this confirmation page: Confirmation.jinja2

<form class="form-horizontal" method="POST">   
    <div class="form-group">
        <label class="control-label col-md-2" for="postal">Postal Code:</label>
            <input type="text" class="form-control" id="postal"  name="postal" />
    </div>
    <div class="form-group">
        <label class="control-label col-md-2" for="address">Detailed Address:</label>
            <textarea class="form-control" rows="3" id="address" name="address"></textarea>
    </div>
    <div class="form-group">
        <label class="control-label col-md-2" for="unit">Unit No #:</label>
            <input type="text" class="form-control" id="unit" name="unit" />
    </div>
    </form>

Solution

  • I think, you can just pass POST from initial form to template of confirmation page, without session.

    If anyway you need session, you can call it from your template

    <input type="text" class="form-control" id="postal" name="postal" value="{{session['postal']}}" />


    # after form submitted, it sends post request, just check if it exist
    if request.POST:
        print("request.POST: ", request.POST)
    
        myform = request.POST
        # you need iterate over keys for this case
        for m in myform.keys():
            print("key: ", m, " value: ", myform[m])
    
        session = request.session
        # you can access request.POST directly or use your variable myfrom 
        # use myform.get('postal','') to get value by key 
        session['postal'] = myform.get('postal','')
        session['address'] = myform.get('postal','')
        session['unit'] = myform.get('unit','')
    
        data = "??"
    
        data_array = data.split(",")
        session['data'] = data_array
    
        session['delivery'] = str(data_array)
    
        print (session['delivery'])
    
        return HTTPFound(location='http://localhost:5555/confirmation')