2012-11-06 119 views
2

我有一個Model類。form.is_valid()返回false

class Search(forms.Form): 
    query=forms.CharField() 

而且,一個視圖函數。

def search(request): 
    c = {} 
    c.update(csrf(request)) 
    if request.method == 'POST': 
    form = Search(request.POST) 
     if form.is_valid(): 
     search_query=form.cleaned_data['query'] 
      return HttpResponse("your query: %s" %search_query , c) 
     else: 
     return HttpResponse(form , c) 
    else: 
    return render_to_response('polls/search.html', c) 

而且,這裏是我的search.html:

<form action="/polls/search" method="post">{% csrf_token %} 
    <p><label for="query_label">query:</label> 
    <input type="text" name="query_txt" id="query_txt_id" /></p> 
    <input type="submit" value="Submit" /> 
</form> 

給予一定的字符輸入後,它總是告訴我下面的純文本(不視爲錯誤)。

「發生服務器錯誤,請與管理員聯繫。」

回答

1

查詢字段的id不正確。 Django預計它是id_query

您不需要對錶單輸入進行硬編碼。如果在模板中包含{{ form.as_p }},Django將正確地輸入render the form

<form action="/polls/search" method="post">{% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Submit" /> 
</form> 

如果你真的想硬編碼在模板的形式,與Django的生產工作的HTML開始,並從那裏定製。請注意,您的模板和下面的代碼段中的表單不會顯示錯誤。有關更多詳細信息,請參閱customizing the form template上的文檔。

<form action="/polls/search" method="post">{% csrf_token %} 
    <p><label for="id_query">Query:</label> <input type="text" name="query" id="id_query" /></p> 
    <input type="submit" value="Submit" /> 
</form> 
+0

非常感謝。但是,如果我只在模板字段中編寫它,它只會產生一個按鈕。沒有文本框。 <形式行動= 「/輪詢/搜索」 的方法= 「POST」> {%csrf_token%} {{form.as_p}} user1802771

+1

阿,您需要將表單添加到您的模板上下文中。在else分支(對於get請求),用'form = Search()'創建一個未綁定的表單,然後用'c.update(form = form)'將其添加到模板上下文中。 – Alasdair