[Answered ]-Passing Django forms' result to a page

1πŸ‘

βœ…

1 Save the result of the operations carried out on the extracted data in the Django Administration. (N.B: I already know how to save the user input)

Create a model to save the user’s entries. app/models.py

class Carloan(models.Model) :
    # In addition to your model fields add the functions that are part of your LoanCalc
    ...

Then create a ModelForm: app/forms.py

class CarLoanForm(forms.ModelForm) :
    class Meta:
        model = Carloan

Use CarLoanForm the same way you normally would except: app/views.py

if request.POST:
    form = CarloanForm(request.POST)
    if form.is_valid():    
        carloan = form.save()
        #pass carloan (the instance) to the template and 
        #call its functions(from LoanCalc) instead of 
        #passing all of the values separately

Lastly, register this Model so it appears in the admin section app/admin.py

from django.contrib import admin
from app.models import Carloan

admin.sites.register(Carloan)

2 I have divided the page into two(one for the form and the other for
the result) and i want to pass the result to one-half of the page to
enable the user to see it.

Using the steps above, carloan will be passed to the view. go ahead and render its values.

Additionally:

Refactor index

your index definition should be refactored slightly, or your POST bound form will never make it to the template:

def index(request):
    if request.POST:
        form = CarloanForm(request.POST)
        if form.is_valid():
            instance = form.save()
    else :
        form = CarloanForm()

    return render_to_response('carloan/index.html', {'form': form},
              context_instance=RequestContext(request))

Refactor your ModelForm

Carry out some operations on the data (extracted using form.cleaned_data[”]) and I have written some lines of code to that effect; – using a ModelForm instead of a regular django form you will get an instance of the model with the user’s values already filled in, you reference them with instance.field.

and i want to carry out the operations in the code above on the extracted data. – the fields that you plan to calculate values for are listed in exclude they will not factor into form validation.

class CarLoanForm(forms.ModelForm) :
    class Meta:
        model = Carloan
        # exclude fields that are calculated from user input
        # NOTE: these fields must be in your model
        exclude = ('interest', 'management_fee'...) 

Refactor result page

Carry out some operations on the data (extracted using form.cleaned_data[”]) and I have written some lines of code to that effect;

  • in results_page under the form.is_valid check, ther is a line: instance = form.save(commit=False) this gets all of the values that the user submitted in a instance of the Carloan Model that has NOT been saved yet.
  • further down: instance.interest = (instance.interest_rate/100) * instance.amount_of_vehicle *(instance.tenure/12) in this line I am calculating one of the excluded fields values (this calculation is a copy of your code).
  • lastly (after all of the operations on the data have been completed) I save the instance of the model.
  • then pass the instance to the template for display.

code:

def result_page(request):
    if request.POST:
        form = CarloanForm(request.POST)
        if form.is_valid():
            # get an instance from the form but don't save it
            instance = form.save(commit=False)
            # calculate excluded field values
            instance.interest = (instance.interest_rate/100) * instance.amount_of_vehicle *(instance.tenure/12)
            ...
            # after you have calculated all of the excluded fields save the instance
            instance.save()

    else :
        form = CarloanForm()

    return render_to_response('carloan/result.html', {'carloan' : instance, 'form' : form},
                          context_instance=RequestContext(request))

Error:

reference before error assignment – What does it say was referenced before assignment? Paste the entire stack trace please.

1πŸ‘

One of the simpler ways would be to store the data in the session in one view, retrieve it in the next. The docs will help.1

Having said that – there are a few other ways to approach the problem. It has been discussed more than once on SO:

πŸ‘€Ngure Nyaga

Leave a comment