Aleksa Terzic
Aleksa Terzic

Reputation: 35

How to pre-populate form with data received from a previous HTML form submission in Django?

I'm trying to populate my ModelForm with some of data that I have submitted to previous HTML page which is also ModelForm. I just want to pass it to another form so it doesn't have to be written twice.

I've tried couple solutions from stackoverflow but they are 6+ years old, kinda outdated and also couldnt come up with solution from django docs https://docs.djangoproject.com/en/2.2/topics/forms/ I have two models, which have same fields which are name and boxid I need to pass it from first input to second(to populate it).

forms.py

class NewCashierForm(forms.ModelForm):
    class Meta:
        model = Cashier
        fields = ("cashier_company", "cashier_dealer", "cashier_name", "cashier_boxid", "cashier_type", "cashier_package", "cashier_otheritem", "cashier_otheritemserial", "cashier_length", "cashier_promotion", "cashier_amount", "cashier_paymenttype")
        labels = {"cashier_company":('Firma'), "cashier_dealer": ('Diler'), "cashier_name":('Ime i prezime'), "cashier_boxid":('Box ID'), "cashier_type":('Tip'), "cashier_package":('Paket'), "cashier_otheritem":('Drugi uredjaj'), "cashier_otheritemserial":('SBU'), "cashier_length":('Dužina'), "cashier_promotion":('Promocija'), "cashier_amount":('Iznos'), "cashier_paymenttype":('Nacin uplate')}
        exclude = ['cashier_published']


def save(self, commit=True):
    cashier = super(NewCashierForm, self).save(commit=False)
    if commit:
        cashier.save()
    return cashier



class NewPersonForm(forms.ModelForm):
    class Meta:
        model = Person
        fields = {"person_name", "person_adress", "person_phone", "person_boxid"}
        labels = {"person_name":('Ime i prezime'), "person_adress":('Adresa'), "person_phone":('Telefon'), "person_boxid":('Box ID')}

def save(self, commit=True):
    person = super(NewPersonForm, self).save(commit=False)
    if commit:
        person.save()
    return person

views.py

def addcashier(request):

    if request.method == 'GET':
        form = NewCashierForm()
    else:
        form = NewCashierForm(request.POST)
        if form.is_valid():
            fs = form.save(commit=False)
            fs.user = request.user
            fs.save()

            return redirect('/byauthor')
    return render (request, 'main/addcashier.html', {'form':form})

def addperson(request):

    if request.method == 'GET':
        form = NewPersonForm()
    else:
        form = NewPersonForm(request.POST)
        if form.is_valid():
            fs = form.save(commit=False)
            fs.user = request.user
            fs.save()

            return redirect('/addcashier')

    return render (request, 'main/addperson.html', {'form':form})

addperson.html and addcashier.html

{% extends "main/base.html" %}


{% block content %}

    <form method="POST">
        {% csrf_token %}

        {{form.as_p}}

        <button class="btn" type="submit">Unos i dodavanje pretplate</button>
    </form>

    <input type="button" value="Otkazi unos" onclick="window.history.back()" /> 

{% endblock %}

Any help and/or hint is appreciated.

Upvotes: 1

Views: 2539

Answers (1)

Aman Garg
Aman Garg

Reputation: 2547

To prepopulate the form, you need to pass an argument initial={} when initializing your form for the GET call. Since you are passing data from one view to another, you should use sessions.

def addperson(request):

    if request.method == 'GET':
        form = NewPersonForm()
    else:
        form = NewPersonForm(request.POST)
        if form.is_valid():
            fs = form.save(commit=False)
            fs.user = request.user
            fs.save()
            request.session["person_form"] = request.POST.dict()  #save the form as a dict in request.sessions

            return redirect('/addcashier')

    return render (request, 'main/addperson.html', {'form':form})

Then in your second view, use this data from sessions to initialize the form.

def addcashier(request):

    if request.method == 'GET':
        # get the form data from the request.session
        form_data = request.session.pop('person_form', {})
        box_id = form_data.get("person_boxid")
        name = form_data.get("person_name")

        form = NewCashierForm(initial={"cashier_name":name, "cashier_boxid":box_id})  # initialize the form with the data

    else:
        form = NewCashierForm(request.POST)
        if form.is_valid():
            fs = form.save(commit=False)
            fs.user = request.user
            fs.save()

            return redirect('/byauthor')
    return render (request, 'main/addcashier.html', {'form':form})

Upvotes: 2

Related Questions