2015-05-31 11 views
6

Sto cercando di salvare il valore di un elemento jQuery che ho aggiunto al mio SurveyWizardForm nel mio class Person(models.Model): e quindi al mio database.Come salvare il valore di un cursore jQuery in un modello Persona?

Tutti gli altri elementi nel mio modulo sono stati creati in modo normale, creando i campi e i widget necessari nel mio forms.py e i dati per ogni domanda nel mio models.py. Di conseguenza, tutti funzionano automaticamente e vengono salvati i dati corretti.

Tuttavia, ho personalizzato il mio SurveyWizardForm su determinate pagine per consentire all'utente di inviare una valutazione per un'immagine tramite una barra di scorrimento jQuery.

Il mio problema è che non riesco a memorizzare questo valore nel mio modello Persona.

Domanda: Come si memorizza il valore della barra di scorrimento in slider_value nel modello Persona?

Tutti i miei tentativi finora hanno semplicemente creato una nuova voce nel modello/DB che non memorizza il valore che ho nel mio Form/views.py. Temo di non collegare correttamente i due pezzi insieme.

Qualsiasi aiuto è molto apprezzato. Grazie

mio codice finora

slider_two.js

Questo aggiorna il campo di modulo nascosto hidden1 con il valore della mia barra di scorrimento jQuery

if($(this).attr("id") == "one") 
     $("#hidden1").val((ui.value > 0 ? '+' : '') + ui.value); 

wizard_form.html

value="0" viene aggiornato quando l'utente sposta il cursore creato nel sopra slider_two.js (non mostrato)

<input type="hidden" name="slider_value" value="0" id="hidden1"/>       

<script src="{% static "survey/js/slider_two.js" %}"></script> 

views.py

posso leggere il valore in views.py utilizzando

slider_value = self.request.POST.get('slider_value') 
if slider_value is not None:     
    instruction_task_values.insert(0, slider_value) 

logger.debug('\n\n\nThis is your instruction_task_values in 1 %s', instruction_task_values) 

Funziona come il valore corretto viene stampato ogni volta sul mio registro

models.py

Si intende creare il campo nel DB per memorizzare il valore della barra di scorrimento. tutte le altre voci che creo funzionano e vengono salvate correttamente.

class Person(models.Model): 
    slider_value = models.IntegerField(null=True, blank=True, max_length=1000) 

forms.py

Questo è dove credo che il mio problema è.

Il seguente è il mio tentativo di "connettersi" allo slider_value esistente nel mio modulo e aggiungerlo al modello Person ma tutto ciò che fa è semplicemente creare un nuovo campo nel mio modulo.

class SurveyFormIT1(forms.ModelForm):  
    class Meta: 
     model = Person  
     fields = ['slider_value'] 
     widgets = {'slider_value' : forms.HiddenInput}  
+0

è necessario passare il modulo per il modello e campo id bisogno di essere 'id =" id_slider_value "' – Goran

+0

usando 'context.update'? – Deepend

risposta

1

Alla fine ho trovato un modo per risolvere questo.

Il problema di fondo era che stavo cercando di aggiungere informazioni a mia Persona modello che non è stato 'generato/nato' dal mio forms.py/models.py in modo tradizionale, ma piuttosto veniva 'generato' in questa pagina dal mio script jQuery .

Sapevo che dovevo creare un campo modello e un campo modulo corrispondente che avrebbe preso il valore. Inizialmente credevo di dover inviare questo valore al mio views.py (come sopra in questione). Questo era sbagliato.

Quando stavo ispezionando le pagine html emesse da SessionWizardView/form_wizard mi sono reso conto che anche se avevo chiamato ognuno dei campi del modulo, ad es. field = ['slider_one_value'] veniva reso come per es.

<input id="id_9-slider_one_value" type="hidden" name="9-slider_one_value" value="-37"></input> 

Il id_9- che viene aggiunto come lo era al nono pagina del sondaggio.

Di conseguenza, se ho modificato il mio jQuery per aggiornare questo campo, allo stesso tempo come il principale campo nascosto inviato al mio punto di vista il valore sarebbe stato memorizzato automaticamente al mio modello

La parte migliore è che posso aggiornare come molti di questi campi come voglio lo stesso copione

spero che questo aiuta a qualcun altro

il mio codice

wizard_form.html

Questo chiama il mio slider_two.js sceneggiatura

<script src="{% static "survey/js/slider_two.js" %}"></script> 

slider_two.js

Crea uno SliderBar sulla pagina che l'utente è in grado di muoversi. E poi aggiorna il risultato e il campo nascosto che viene inviato ai punti di vista

Si aggiorna anche i campi nascosti di nuova creazione che corrispondono a quelli creati nel modello dopo che sono stati resi attraverso il SessionWizardView

$('#submit').click(function() { 
    var username = $('#hidden').val(); 
    if (username == "") username = 0; 
    $.post('comment.php', { 
     hidden: username 
    }, function(return_data) { 
     alert(return_data); 
    }); 
}); 

$(".slider").slider({ 
    animate: true, 
    range: "min", 
    value: 0, 
    min: -100, 
    max: +100, 
    step: 1, 

    //This updates the slider-result below the slider bar so the participant can see their rating 
    slide: function(event, ui) { 
     $("#slider-result").html((ui.value > 0 ? '+' : '') + ui.value); 

    //This updates the hidden form field which is read by my views.py 
    if($(this).attr("id") == "one") 
     $("#hidden1").val((ui.value > 0 ? '+' : '') + ui.value); 

    //This updates the id_9-slider_one_value form field which matches the name of fields = ['slider_one_value'] after it has been rendered 
    if($(this).attr("id") == "one") 
     $("#id_9-slider_one_value").val(ui.value); 

    //This updates the id_10-slider_two_value form field which matches the name of fields = ['slider_one_value'] after it has been rendered 
    if($(this).attr("id") == "one") 
     $("#id_10-slider_two_value").val(ui.value); 


    .... 

    // Update as many hidden forms fields as necessary 

    } 
}); 

models.py

crea le voci nel database per memorizzare il valore

slider_one_value = models.SmallIntegerField(null=True, max_length=100, blank=True) 
slider_two_value = models.SmallIntegerField(null=True, max_length=100, blank=True) 

forms.py

crea i campi moduli nascosti per assumere i valori dallo script jQuery

class SurveyFormF1(forms.ModelForm):  
    class Meta: 
     model = Person  
     fields = ['slider_one_value'] 
     widgets = {'slider_one_value' : forms.HiddenInput} 

class SurveyFormF2(forms.ModelForm):   
    class Meta: 
     model = Person   
     fields = ['slider_two_value'] 
     widgets = {'slider_two_value' : forms.HiddenInput} 
2

È consigliabile modificare correttamente il codice in work with forms.

Per esempio, nella vostra views.py:

def my_view(request): 
    # if this is a POST request we need to process the form data 
    if request.method == 'POST': 
     # create a form instance and populate it with data from the request: 
     form = SurveyFormIT1(request.POST) 
     # check whether it's valid: 
     if form.is_valid(): 
      # process the data in form.cleaned_data as required 
      slider_value = form.cleaned_data['slider_value'] 
      if slider_value is not None:  
       instruction_task_values.insert(0, slider_value) 
      logger.debug('\n\n\nThis is your instruction_task_values in 1 %s', instruction_task_values) 
      # redirect to a new URL: 
      return HttpResponseRedirect('/thanks/') 

    # if a GET (or any other method) we'll create a blank form 
    else: 
     form = SurveyFormIT1() 

    return render(request, 'wizard_form.html', {'form': form}) 

Nella tua wizard_form.html:

{{ form.as_p }} 
<script src="{% static "survey/js/slider_two.js" %}"></script> 

{{ form.as_p }} sarà solo darvi qualcosa di simile

<input type="hidden" name="slider_value" value="" id="id_slider_value"/> 
+0

Non sono sicuro di seguirti. Puoi dirmi come o dove il mio codice non funziona correttamente con i moduli? cosa non avrei dovuto fare o cosa avrei dovuto fare? Questo non sembra rispondere a nessuna parte della mia domanda – Deepend

+0

@Deepend Ho fornito il codice per la funzione di visualizzazione con l'uso del tuo codice (è all'interno dell'istruzione 'if form.is_valid():' Tutto ciò che serve è ciò di cui hai bisogno per rendere il tuo modulo correttamente elaborato (hai seguito il link dalla mia risposta? C'è una bella introduzione ai form). Inoltre nel tuo ** wizard_form.html ** devi sostituire '' con '{{form.as_p}}' che ti darà output come questo ' '. – akarilimano

+0

@Deepend se vuoi sapere cosa stai facendo male: in primo luogo, provi a leggere direttamente dal POST' slider_value = self.request.POST.get ('slider_value') 'che è male , perché hai già il formato 'SurveyFormIT1' in grado di farlo.Puoi anche vedere il codice giusto nella mia risposta – akarilimano

1

si dovrebbe fare qualcosa di simile

if request.method == 'POST': 
form = SurveyFormIT1(request.POST) 
if form.is_valid(): 
    survey=form.save(commit=False) 
    survey.slider_value=form.cleaned_data['slider_value'] 
    survey.save() 

In primo luogo si dovrebbe verificare se si ottiene il valore corretto nella richiesta, una volta che l'avete, basta salvare manualmente come nell'esempio precedente. Dovresti anche escludere il campo slider_value dal modulo in quanto non sarà valido finché non avrai passato il valore corretto ad esso.

So che ci sono soluzioni più eleganti, ma questo è facile da capire.

Spero che questo aiuti

Problemi correlati