Search code examples
djangodjango-formsdjango-templatesdjango-viewsdjango-sessions

Django: Form Data Not Being Accessed to Store Data in Session


views.py

from textize.models import Textizer
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.context_processors import csrf

def index(request):
    if request.method == 'POST':
        form = Textizer(request.POST)
        print "debug 0"  # <---It's not reaching this point when I submit the data via the form
        if form.is_valid():  #check to see if the input is valid
            print "debug 1"
            request.session['text'] = form.cleaned_data['to_textize']  #set the session key:value pair
            return HttpResponseRedirect('/results') #redirect to the results page

    else:
        form = Textizer()
        print "debug 2" # reaches here

    c = {'form': form}
    c.update(csrf(request))

    return render_to_response('index.html', c)

def results(request):
    text = request.session.get("text", "dummy")
    c = {'text' : text}
    return render_to_response('results.html', c)

index.html

<form action="/results" method="POST"> {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form> 

results.html

<b>Input text: </b>{{ text }} 

I'm trying to pass data from the 'index' page to the 'results' page. In this case, I'd like to display the string typed and submitted on the results page.

What's wrong with my form?

Also, am I forming the session key:value correctly?


Solution

  • from textize.models import Textizer
    from django.http import HttpResponseRedirect
    from django.shortcuts import render_to_response
    from django.core.context_processors import csrf
    
    def index(request):
    
        form = Textizer(request.POST or None)
    
        if request.method == 'POST':
            print "debug 0"
            if form.is_valid():
                print "debug 1"
                request.session['text'] = form.cleaned_data['to_textize']
    
        c = {'form': form, 'text':request.session.get("text", "")}
        c.update(csrf(request))
    
        return render_to_response('index.html', c)
    

    and then template index.html

    <form action="" method="POST"> {% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Submit" />
    </form> 
    result: {{ text }}
    

    is enough to get this going.