2013-09-21 49 views
2

我第一次嘗試創建一個小Django應用程序。它只是一個基本頁面,有兩種形式,一種是從數據庫返回值(運行良好)的搜索表單,另一種是插入表單(問題)。在插入表單中,有三個文本字段要求數據庫中新行的值。該應用程序被稱爲「搜索者」。這裏是我的代碼:沒有返回HttpResponse對象。到底是怎麼回事?

views.py

from django.http import HttpResponse 
from django.template import Context 
from django.template.loader import get_template 
from searcher.models import Publisher 
from django.db.models import Q 

def search(request): 
    if "search" in request.GET: 
     value = request.GET['search'] 
     results = Publisher.objects.filter(Q(city__contains=value) | Q(name__contains=value)) 

    else: 
     value = "No term" 
     results = [] 
    template = get_template("base.html") 
    html = template.render(Context({"value":value, "results":results})) 
    return HttpResponse(html) 

def insert(request): 
    if "name" in request.POST: 
     for key in request.POST: 
      counter = 0 
      if key != '': 
       counter = counter + 1 
     if counter == len(request.POST): 
      row = Publisher(name=request.POST['name'], city=request.POST['city'], website=request.POST['website']) 
      row.save()  

base.html文件

<html> 
    <body> 
     <form method = "GET" action = ""> 
      <input type = "text" name = "search"><input type = "submit"> 
     </form><br> 

     you searched for:{{value}}<br> 

     your results: 
     {% for result in results %} 
      <br>{{result}}<br> 
     {% endfor %}  
     <br><br> 
     <form method = "POST" action = "/test/insert/"> 
      <input type = "text" name = "name" value = "name"><br> 
      <input type = "text" name = "city" value = "city"><br> 
      <input type = "text" name = "website" value = "website"><br> 
      <input type = "submit"> 
     </form> 
    </body> 
</html> 

urls.py

from django.conf.urls import patterns, include, url 
from searcher import views 

urlpatterns = patterns('', 
    url(r'^test/$', views.search), 
    url(r'^test/insert/$', views.insert), 
) 

錯誤是說:「在ValueError錯誤/測試/插入視圖searcher.views.insert沒有返回HttpResponse對象。「作爲我提交插入表單的結果。

我明白錯誤在說什麼:對不起,但views.py中的所有視圖必須返回要顯示的內容。

首先這是爲什麼?

第二,完成插入表單的正確方法是什麼?目前我已經設置了表單action =「/ test/insert /」,這樣在urls.py中就可以識別插入表單被提交併調用函數insert,應該如何調用該函數?

回答

3

你似乎在問兩個問題

  1. 「爲什麼必須將所有視圖返回一些東西給?」

    你誤解了錯誤信息。你看到的錯誤沒有 說「所有視圖必須返回一些顯示」 - 它只表示 「searcher.views.insert沒有返回預期的HttpResponse」。 由於您正在處理HTTP請求(表單POST),因此您希望 發送一個HTTP響應。所有的HTTP請求都會得到一個 響應 - 這是一個關於如何與 進行通信的標準協議 - 詳細信息是http standard definition的一部分,並且在this answer中有所解釋。

  2. 「完成插入表單的正確方法是什麼?」

    您正在實現它 - 只需發回POST的HTTP響應 。它的代碼幾乎與 爲響應搜索請求而發回的內容幾乎相同(也許您希望 在說明插入已成功完成時添加消息, 您在搜索請求中可能已返回的位置 正在搜索的項目?)。

    如果您想避免完全刷新表單,您可能需要再次使用ajax調用而不是http調用,如here所述。

+0

事情是,我希望這個插入函數可以被認爲是完全服務器端,所以它就像:「在觸發器上,做這個服務器端函數」。現在我想知道如何使用我正在使用的方法來運行該函數,但稍微改變一下以防止出現錯誤?當然,有一種運行函數的方式,不必每次都返回一個HttpResponse,這是一場噩夢(我來自PHP世界)! views.py絕對是放置這種功能的正確地方嗎?我的意思是,它是一個完整的函數返回SEE的文件。 – user2800761

+0

也許你想通過HTTP做一些其他的事情 - 使用javascript做一個Ajax調用(通過XmlHttpRequest發佈) - 請參閱我的答案中的第二個鏈接 – blueberryfields

+0

對不起,很煩人,但如果我不希望它是AJAX?非常感謝您的幫助。 – user2800761

1

所有視圖必須返回一個HttpResponse對象,因爲這是服務器返回到最初發出請求的瀏覽器的內容。根據定義,非常多的視圖是一個可調用的接受請求對象並返回響應對象的調用。

在views.py中沒有返回響應的代碼很好,比如視圖的輔助函數,但將這些代碼用作視圖並不好。

處理POST請求時的常用模式是在成功時返回重定向到成功頁面,並在失敗時重新顯示帶有相應錯誤消息的表單。請參閱"Using a form in a view"文檔。

+0

好的,所以解決這個問題的唯一方法是返回成功消息(或類似的東西)?謝謝回覆! – user2800761

+0

你必須退貨。如果表單是由網頁上的人員提交的,通常的做法是在成功時將重定向返回到帶有成功消息的頁面 - 您希望使用表單將用戶從頁面中移出以避免意外多次提交。成功返回的絕對最小值是HTTP狀態204,「無內容」,但在正常情況下不會使用它。 –

相關問題