2013-02-12 100 views
8

我對django非常陌生,並且努力做一些非常簡單的事情。 我有以下模型ModelFormdjango:在同一頁面輸入並顯示輸出結果

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

而且我向用戶顯示一個簡單的形式,將做以下幫助:

  • 用戶會問一個問題
  • 的問題將被處理(根據問題將產生一個數據庫查詢 )

  • 然後查詢結果shou ld將顯示在 相同頁面的表格下方。

這是我的views.py看起來像:

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 

現在我想簡單的東西,我是把形式的查詢字段中的值,並試圖將其發送回該頁面;到目前爲止我失敗了。 這是index.html的:

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

如果我能做到這一點,我想查詢充塞不會是tough.The形式是工作的罰款,該的數據都是得到保存在數據庫中。表格提交後,中只有response字符串views.py無法檢索。你能幫忙嗎?

編輯: 嘗試基於霍夫的回答中index.html如下:

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

仍然沒有運氣:(

+2

你應該使用GET而不是POST。我認爲你執行搜索 – catherine 2013-02-12 16:51:21

+0

謝謝:)編輯。 – 2013-02-12 17:12:37

回答

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

你可以請解釋一下:/困惑... – 2013-02-12 17:49:06

+0

整個代碼:P應該所有這些駐留在views.py或HTML部分應該在index.html?如果那我的ModelForm正在使用? – 2013-02-12 17:56:49

+0

當用戶提交問題「如果」條件將被觸發並搜索該問題時,輸出:它會顯示包含您提交內容的問題列表 – catherine 2013-02-12 18:02:46

3

你需要的是一個異步後(阿賈克斯),這是很容易使用jQuery,見這個答案的完整解決方案:How to POST a django form with AJAX & jQuery

+0

請檢查編輯的問題。我仍然不走運。 :( – 2013-02-12 17:13:29

1

繼霍夫的回答......

添加網址屬性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; 
    }); 
}); 

一些Ajax處理程序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 

試過類似的東西?

+0

現在就試試。 :)看起來很有前途... – 2013-02-12 18:07:53

+0

讓我知道它是怎麼回事:) – Ogre 2013-02-12 21:45:41

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

您可以檢查是否提交表單或沒有(我。e如果它是一個發佈請求或不):

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) 
在模板

然後,檢查是否上下文變量post_output存在,如果它確實顯示輸出:

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


總之,邏輯是:

  1. 檢查相關request.POST字典是否存在或不在您的視圖中。
  2. 如果密鑰存在,那麼它是一個post請求;添加帖子相關的上下文變量,併發布相關任務。
  3. 檢查模板中是否有任何帖子相關的上下文變量可用,如果有,請顯示帖子相關的輸出。

如果不希望顯示在頁面帖子後,只需刷新輸出,通過request對象模板,做這樣的檢查:

{% if request.POST.submit and post_output %} 
相關問題