2013-02-12 17 views
8

Jestem całkiem nowy dla django i staram się zrobić coś bardzo prostego. Mam ModelForm w następnym modeludjango: pobieranie danych wejściowych i wyświetlanie danych wyjściowych na tej samej stronie

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

A ja pokazując użytkownikowi prosty formularz, który pomoże w sposób następujący:

  • użytkownik będzie zadać pytanie
  • The pytanie zostanie przetworzone (zapytanie bazy danych zostanie wygenerowane na podstawie pytania)

  • Następnie wynik zapytania Zostanie wyświetlona tuż pod formularzem na tej samej stronie.

To jest jak moja views.py wygląda następująco:

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 

Na razie staram prostych spożywczych, biorę wartość w polu zapytania formularza i próbuje wysłać go z powrotem do strona, do tej pory nie udało mi się. to index.html:

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

Gdybym mógł to zrobić, myślę, że kwerenda spożywcze przyzwyczajenie się, że tough.The formularz działa poprawnie, gdy dane osobowe są coraz zapisany w bazie danych. Tylko ciąg response z views.py nie mógł być pobrany wewnątrz index.html po przesłaniu formularza. Czy możesz mi pomóc?

EDIT: Próbowałem następujących w index.html podstawie Hoff za odpowiedź:

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

Wciąż nie szczęścia :(

+2

używaj GET zamiast POST. Myślę, że wykonujesz wyszukiwanie – catherine

+0

dzięki :) Edytowane. –

Odpowiedz

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

Czy możesz wyjaśnić to nieco:/Confused ... –

+0

cały kod: P powinny wszystkie te znajdują się w views.py lub część html powinna być w index.html? Jeśli to gdzie mój ModelForm jest używany? –

+0

Gdy użytkownik przesłać pytanie "jeśli" warunek będzie wyzwalać i rozpoczyna poszukiwania tego pytania.Odpowiedź: wyświetli listę pytań, które zawiera, co przesłać. – catherine

1

następującą odpowiedź Hoff za ...

Dodaj atrybut URL do ajax rozmowy:

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

Niektóre ajax handler w 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 

Próbowałem czegoś takiego?

+0

Teraz spróbuję. :) Wydaje się obiecujące ... –

+0

Daj mi znać, jak to idzie :) – Ogre

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

można sprawdzić, czy formularz został złożony, czy nie (i.e jeśli to żądanie POST lub nie):

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) 

Następnie w szablonie, sprawdź czy kontekst zmienna post_output istnieje, jeśli ma pokazać wyjście:

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


w skrócie, logikę to:

  1. Sprawdź, czy odpowiedni klawisz dyktowania request.POST istnieje, czy nie.
  2. Jeśli klucz istnieje, to jest to żądanie pocztowe; dodawanie powiązanych ze sobą zmiennych kontekstowych i wykonywanie zadań pokrewnych.
  3. Sprawdź, czy w szablonie dostępna jest dowolna zmienna kontekstowa, a jeśli tak, pokaż wyniki pokrewne.

Jeśli nie chcą pokazać wyjście, gdy strona jest po prostu odświeżane po poście, przekazać obiekt request do szablonu i wykonać test tak: powinni

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