2009-12-10 70 views
8

Django的新手問題....傳遞一個初始值到Django的表單字段

我想寫一個搜索表單和維護搜索請求和搜索結果之間的輸入框的狀態。

這裏是我的形式:

class SearchForm(forms.Form): 
    q = forms.CharField(label='Search: ', max_length=50) 

這是我的看法代碼:

def search(request, q=""): 
    if (q != ""): 
     q = q.strip() 
     form = SearchForm(initial=q) 
     #get results here... 
     return render_to_response('things/search_results.html', 
      {'things': things, 'form': form, 'query': q}) 
    elif (request.method == 'POST'): # If the form has been submitted 
     form = SearchForm(request.POST) 
     if form.is_valid(): 
      q = form.cleaned_data['q'] 
      # Process the data in form.cleaned_data 
      return HttpResponseRedirect('/things/search/%s/' % q) # Redirect after POST 
     else: 
      form = SearchForm() 
      return render_to_response('things/search.html', { 
      'form': form, 
      }) 
    else: 
     form = SearchForm() 
     return render_to_response('things/search.html', { 
      'form': form, 
     }) 

但是,這給我的錯誤:

Caught an exception while rendering: 'unicode' object has no attribute 'get' 

如何傳遞的初始值?我嘗試過的各種東西似乎都會干擾request.POST參數。

回答

9

有幾件事情是不是在這裏好......

1)開機自檢後,推薦的就是重定向。這樣可以避免臭名昭着的彈出窗口提示您在使用後退按鈕時重新提交表單。

2)您不必說if request.method == 'POST',只需if request.POST。這使您的代碼更易於閱讀。

3)視圖通常看起來像:

def myview(request): 
    # Some set up operations 
    if request.POST: 
     form=MyForm(request.POST) 
     if form.is_valid(): 
      # some other operations and model save if any 
      # redirect to results page 
    form=MyForm() 
    #render your form template 

這並不是說不能有更簡單和更復雜的看法。但這是一個觀點的要點:如果請求是後處理的形式和重定向;如果請求得到呈現的形式。

我不知道你爲什麼得到一個Unicode錯誤。我只能認爲它與你沒有提供的一個模型有關。 錯誤,因爲spookylukey提到是在他的評論中,很可能是由您提交一個字符串而不是字典的初始參數。

我真的推薦django文檔,在particular the tutorial.,但也有很好的Django Book

所有這一切說,我覺得你想要的東西,如:

def search(request, q=None): 
    if request.POST: 
     form = SearchForm(request.POST) 
     if form.is_valid(): 
      q = form.cleaned_data['q'] 
      url=reverse('search_results', args=(q,)) 
      return HttpResponseRedirect(url) 
    if q is None: 
     form = SearchForm() 
    else: 
     form = SearchForm(initial={'q': q}) 
    return render_to_response('things/search.html', { 
     'form': form, 
    }) 

注意初始參數是表單的字段值的字典。

希望有所幫助。

+2

的錯誤是由於經過一個Unicode對象,而不是一個字典的。 (dict定義'get()',但string/unicode不)。 – spookylukey 2009-12-10 18:01:27

+0

啊,優點。我看到錯誤,但沒有建立連接! – cethegeek 2009-12-10 18:03:02

+0

感謝您的詳細評論和解決方案。我以這種方式實現了它,因爲我希望結果URL看起來像/ search/query(但我知道這存在問題,並且可能會修改它)。我在POST後重定向,因此按Back按鈕沒有問題。 – AP257 2009-12-10 18:21:59

5

Django表單對您的用例並不特別有用。另外,對於搜索頁面,使用GET表單並維護URL中的狀態要好得多。下面的代碼更短,更簡單,符合好得多HTTP標準:

def search(request): 
    q = request.GET.get('q','').strip() 
    results = get_some_results(q) 
    render_to_response("things/search.html", {'q': q, 'results': results}) 

模板:

<form method="GET" action="."> 
<p><input type="text" value="{{ q }}" /> <input type="submit" value="Search" /></p> 
{% if q %} 
    {% if results %} 
     Your results... 
    {% else %} 
     No results 
    {% endif %} 
{% endif %} 
</form> 
+0

+1,確實似乎更好地實現了他的意圖。 – cethegeek 2009-12-10 18:16:41

相關問題