Maddie Graham
Maddie Graham

Reputation: 2177

Obtaining data from the form with GET data. Django

How can I get data from the form using the GET method?

For example, I have this form:

class LoansSearchForm(forms.Form):
    balance = forms.IntegerField(label='', required=False)

In my view display in the form template this way:

def search_results(request):
    form = LoansSearchForm(request.GET)
    cd = form.cleaned_data
    word = cd['balance']

    context = {'form': form,
               'test': word,}
    return render(request, 'search_results.html', context)

But i still a error:

'LoansSearchForm' object has no attribute 'cleaned_data'

When trying to get them this way:

word = form['balance']

I receive a field with completed data. How to get the data from my the form correctly?

Is my form written correctly? Should I use something like that? (sorry if my question is trivial, but I found very little information about GET forms)

if request.method == 'GET':
    form = LoansSearchForm(request.GET)
    if form.is_valid():
        print('Hello World')
else:
    form = LoansSearchForm()

Upvotes: 0

Views: 823

Answers (3)

Aula
Aula

Reputation: 121

I used name=form.data['field_name'], think it answers your answer of obtaining form values on submit.

Upvotes: 0

xxbinxx
xxbinxx

Reputation: 1553

Recommended: run form.is_valid() and then you do form.cleaned_data

def search_results(request):
    form = LoansSearchForm(request.GET)
    if form.is_valid():
        cd = form.cleaned_data
        word = cd['balance']
    else:
        word = None

    context = {'form': form,
               'test': word,}
    return render(request, 'search_results.html', context)

Forms only get a cleaned_data attribute when is_valid() has been called, and you haven't called it anywhere.

more on cleaned data - documentation

Upvotes: 2

Işık Kaplan
Işık Kaplan

Reputation: 2982

def search_results(request):
    form = LoansSearchForm(request.GET)
    cd = form.cleaned_data                       # here <------
    word = cd['balance']

    context = {'form': form,
               'test': word,}
    return render(request, 'search_results.html', context)

The problem with your code is that forms are not filled on initialization but when you call form.is_valid, if the form is indeed valid, then it populates cleaned_data

You can read more about the related documentation.

Upvotes: 2

Related Questions