Alexxio
Alexxio

Reputation: 1101

django ajax request

I am having a problem sending a form with Ajax. I have a form which i want to replace with another form asynchronously on clicking the next button.

Here is the script

$(document).ready(function() {
    $('#MY_FORM').submit(function() { 
        $.ajax({
            data: $(this).serialize(), 
            type: $(this).attr('method'),
            url: $(this).attr('action'), 
            success: function(response) { 
                $('#FORM_DIV').html(response); 
            }
        });
        return false;
    });
});

form.py

class CountyForm(forms.Form):
    county = forms.ModelChoiceField(queryset=County.objects.all(),
              empty_label='---Select a county---', required=False)
    other = forms.CharField(required=False)

    def __init__(self, *args, **kwargs):
        super(CountyForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.html5_required = True
        self.helper.form_id = 'MY_FORM'
        self.helper.add_input(Submit('next', 'Next', css_class='classfinish'))
        self.helper.layout = Layout('county','other')


class WardForm(forms.Form):
    ward = forms.ModelChoiceField(queryset=Ward.objects.all(),
             empty_label='Select a ward')
    other = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(WardForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.html5_required = True
        self.helper.add_input(Submit('save', 'Finish'))
        self.helper.add_input(Submit('cancel', 'Cancel'))
        self.helper.layout = Layout('ward','other')

views

def location(request):
    if request.is_ajax() :
        wardform = WardForm()
        return HttpResponse(wardform)
    countyform = CountyForm()
    c = {}
    c.update(csrf(request))
    return render(request,'location.html', {'countyform': countyform})

I want when i click next button in the county form, the ward form to appear.

Upvotes: 6

Views: 1627

Answers (1)

Henrik Andersson
Henrik Andersson

Reputation: 47172

This could be solved in two ways, I won't cover FormWizard but I'll give you the link to the documentation which is really good.

My recommendation is that you should go for a FormWizard (depending on what version of Django you have) but I think it was migrated into Django at 1.2 and onwards but don't quote me on that.

In you current predicament you should do something along the lines of this.

$(document).ready(function() {
    $('#MY_FORM').submit(function() { 
        $.ajax({
            data: $(this).serialize(), 
            type: $(this).attr('method'),
            url: $(this).attr('action'), 
            success: function(response) { 
                $('#FORM_DIV').load('/some/url/to/a/wardform'); //new code 
            }
        });
        return false;
    });
});

views.py

def ward_form_renderer(request):
    if request.is_ajax():
        ward_form = WardForm()
        #depending on version of django
        context = {'wardform': ward_form}
        context.update(csrf(request))
        render(request, 'wardform_template', c)

What this will do is that it will pull a new html page with a rendered form from your Django view and display it. Basically what you've then done is a FormWizard. This approach will have other side effects so I wouldn't recommend doing it this way.

I myself is in a project that does this and it's more pain than pleasure to be honest. I haven't tried this code myself but you get the gist of how it should work.

Enter FormWizard! This is particular good choice for you since you dont have to redefine your forms, you can use the ones you have.

Here's the link to the FormWizard docs

Good luck!

Upvotes: 1

Related Questions