2009-12-10 8 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' 

にはどうすれば初期値を渡すことができますか?私が試した様々なことがリクエストに干渉するようです.POSTパラメータ。

答えて

9

ここではいくつかのことがうまくいかない...

1)POST後におすすめのものはリダイレクトすることです。これにより、戻るボタンを使用してフォームを再送信しているという悪名高いポップアップが回避されます。

2)if request.method == 'POST'と言う必要はありません。ちょうどif request.POSTです。これにより、コードを読みやすくなります。はるかに簡単とはるかに複雑見解がないことを言っているのではない

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 

3)ビューには、一般的のようになります。しかし、それはビューの要点です:リクエストがフォームの後処理であり、リダイレクトした場合。リクエストがフォームをレンダリングする場合。

なぜユニコードエラーが発生するのかわかりません。あなたが提供していないモデルの1つに関連しているとしか思えません。 spookylukeyのコメントがコメントにありますが、おそらく最初のパラメータにdictの代わりに文字列を送信したことが原因です。

私は実際にparticular the tutorial.にdjangoのドキュメントをお勧めしますが、非常に素晴らしい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

エラーが原因のdictの代わりにUnicodeオブジェクトを渡すことにあります。 (dictは 'get()'を定義しますが、string/unicodeは定義しません)。 – spookylukey

+0

ああ、優れた点。私はエラーを見たが、接続をしなかった! – cethegeek

+0

詳細なコメントとソリューションをありがとう。結果URLが/ search/queryのように見えたかったので、私はこの方法で実装しました(私はそこに問題があると知っていますし、よく改訂するかもしれません)。私はPOSTの後にリダイレクトするので、Backボタンを押しても問題はありません。 – AP257

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

関連する問題