2013-02-28 23 views
6

Ho riscontrato un problema nell'invio di un modulo con Ajax. Ho un modulo che voglio sostituire con un altro modulo in modo asincrono sul clic sul pulsante successivo.django ajax request

Ecco lo 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') 

vista

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}) 

voglio quando scatto pulsante accanto nella forma della contea, il modulo di corsia di apparire .

+3

Qual è la tua domanda? Ti manca una citazione dopo '# FORM_DIV' però. –

+0

Il tuo JS ha un errore di sintassi – Blender

+1

@Pavel era un errore di battitura, grazie. – Alexxio

risposta

1

Questo problema può essere risolto in due modi, non includerò FormWizard ma fornirò il collegamento alla documentazione che è veramente buona.

La mia raccomandazione è che dovresti andare per un FormWizard (a seconda della versione di Django che hai) ma penso che sia stato migrato in Django a 1.2 in poi ma non citarlo su questo.

Nella tua situazione attuale dovresti fare qualcosa del genere.

$(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) 

Che cosa questo farà è che tirerà una nuova pagina HTML con un modulo reso dalla visualizzazione Django e visualizzarlo. Fondamentalmente ciò che hai fatto è un FormWizard. Questo approccio avrà altri effetti collaterali quindi non consiglierei di farlo in questo modo.

Io stesso sono in un progetto che fa questo ed è più dolore che piacere ad essere onesti. Non ho provato questo codice da solo ma ottieni il succo di come dovrebbe funzionare.

Immettere FormWizard! Questa è una buona scelta per te dato che non devi ridefinire i tuoi moduli, puoi usare quelli che hai.

Here's the link to the FormWizard docs

Buona fortuna!