2013-02-12 39 views
8

Sono abbastanza nuovo a Django e lottando per fare qualcosa di molto semplice. Ho un ModelForm per il seguente modello:django: prendendo l'input e mostrando uscita nella stessa pagina

class Queries(models.Model): 
    user_id=models.CharField(max_length=200) 
    query=models.CharField(max_length=200) 

E sto mostrando all'utente una forma semplice che vi aiuterà a fare la seguente:

  • utente chiederà una domanda
  • Il la domanda verrà elaborata (verrà generata una query del database in base alla domanda)

  • Quindi il risultato della query è shou Si può visualizzare appena sotto il modulo nella stessa pagina .

Ecco come il mio views.py assomiglia:

from django.http import HttpResponse 
from django.shortcuts import get_object_or_404, render 
from basicapp.models import QueryForm 

def index(request): 
    form=MyForm() 
    real_form=form.getForm(request) 
    response=form.response 
    return render(request,'basicapp/index.html',{ 
     'form': real_form, 
     'response':response, 
    }) 
class MyForm: 
    response='' 
    def getForm(self,request): 
     form = QueryForm(request.POST) 
     if form.is_valid(): 
      response=form.cleaned_data['query'] 
      form.save() 
     return form 

Per ora sto cercando stoffe semplici, sto prendendo il valore nel campo di interrogazione della forma e cercando di inviare di nuovo a la pagina, finora sono fallito. Questo è index.html:

<form action=" " method="post">{% csrf_token %} 
{{ form }} 
<p>{{response}}</p> 
<input type="submit" value="Submit" /> 
</form> 

Se potessi fare questo, credo che la query infila wont essere che tough.The modulo sta lavorando bene, i dati sono sempre salvati nel database. Solo la stringa response da views.py non può essere recuperata all'interno di index.html dopo l'invio del modulo. Puoi per favore aiutare?

EDIT: provato seguendo index.html in base alla risposta del Hoff:

<form id="myForm" action=" " method="get">{% csrf_token %} 
    {{ form }} 
    <input type="submit" value="Submit" /> 
</form> 
<div id="response"> 
</div> 
<script language="JavaScript"> 
    $(document).ready(function() { 
     $("#myForm").submit(function() { // catch the form's submit event 
      $.ajax({ // create an AJAX call... 
       data: $(this).serialize(), // get the form data 
       type: $(this).attr('GET'), 
       success: function(response) { // on success.. 
        $("#response").html(response); // update the DIV 
       } 
      }); 
      return false; 
     }); 
    }); 
</script> 

Ancora nessuna fortuna :(

+2

si dovrebbe usa GET invece di POST. Penso che tu esegua una ricerca – catherine

+0

Grazie :) Modificato. –

risposta

9

views.py

def index(request): 
    questions=None 
    if request.GET.get('search'): 
     search = request.GET.get('search') 
     questions = Queries.objects.filter(query__icontains=search) 

     name = request.GET.get('name') 
     query = Queries.object.create(query=search, user_id=name) 
     query.save() 

    return render(request, 'basicapp/index.html',{ 
     'questions': questions, 
    }) 

html

<form method="GET"> 
    Question: <input type="text" name="search"><br/> 
    Name: <input type="text" name="name"><br/> 
    <input type="submit" value="Submit" /> 
</form><br/><br/> 


{% for question in questions %} 
<p>{{question}}</p> 
{% endfor %} 
+0

si può spiegare un po ':/confuso ... –

+0

l'intero codice: P dovrebbero essere tutti questi risiedono nella views.py o la parte html devono essere in index.html Se quella in cui si utilizza il mio ModelForm?? –

+0

Quando l'utente sottoporre la questione "se" condizione sarà grilletto e alla ricerca di quel inizio domanda l'output:.. mostrerà l'elenco delle domande che contiene quello che hai inviare – catherine

3

Quello che vi serve è un messaggio asincrono (Ajax), che è facile con jQuery, vedere questa risposta per una soluzione completa: How to POST a django form with AJAX & jQuery

+0

Si prega di verificare la domanda modificata. Sono ancora sfortunato. :( –

1

seguito la risposta di Hoff ...

Aggiungi attributo URL chiamata AJAX:

$(document).ready(function() { 
    $("#myForm").submit(function() { // catch the form's submit event 
     $.ajax({ // create an AJAX call... 
      data: $(this).serialize(), // get the form data 
      type: $(this).attr('GET'), 
      url: '/URL-to-ajax-view/', 
      success: function(response) { // on success.. 
       $("#response").html(response); // update the DIV 
      } 
     }); 
     return false; 
    }); 
}); 

Alcuni gestore ajax in views.py:

# /URL-to-ajax-view/ 
def ajax_get_response(request): 
    if request.method == "GET" and request.is_ajax: 
     form = QueryForm(request.POST or None) 
     if form.is_valid(): 
      form.save() 
      return HttpResponse(form.response) 
    raise Http404 

Hai provato qualcosa del genere?

+0

Proverà ora. :) Sembra promettente ... –

+0

Fammi sapere come va :) – Ogre

1
<input type="text" name="query" /> 
<input type="submit" name="submit" value="Submit" /> 

è possibile verificare se il modulo è stato inviato o meno (i.e se si tratta di una richiesta POST o meno):

if 'submit' in request.POST: #you could use 'query' instead of 'submit' too 
    # do post related task 
    # add context variables to render post output 
    # add another context variable to indicate if it's a post 
    # Example: 
    context.update({'post_output': request.POST.get('query','')}) 
... 
return render(request, 'index.html', context) 

Poi nel modello, controllare se esiste contesto variabile post_output, se Mostrano l'output:

{% if post_output %} 
    Output: {{ post_output }} 
{% endif %} 


In breve, la logica is:

  1. Verificare se esiste una chiave di dettatura request.POST pertinente o meno nella visualizzazione.
  2. Se la chiave esiste, allora si tratta di una richiesta di posta; aggiungi variabili di contesto correlate al post e fai postare attività correlate.
  3. Verificare se qualsiasi variabile di contesto post correlati è disponibile nel modello e se lo fa, spettacolo post correlati uscita.

Se non si desidera visualizzare l'output quando la pagina viene semplicemente aggiornato dopo un post, passare l'oggetto request per il modello e fare un controllo del genere:

{% if request.POST.submit and post_output %} 
Problemi correlati