2013-04-17 7 views
11

ユーザーが2つのアクションを実行できるライブラリ用のフォームを作成しようとしています。新しいブックを追加したり、既存のブックの情報を開くことができます。書籍には2つのフィールド(タイトルと著者)があります。 新しい本が作成されるたびに、その書籍がデータベースに保存されます。以前に作成された書籍は、ドロップダウンリスト(名前のみ)にオプションとして表示されます。ユーザーがドロップダウンリストからオプションを選択すると、選択したブックの情報が画面に表示されます。djangoフォームのドロップダウンリスト

私は2つの異なるアプローチを試みてきましたが、いずれも自分の要件を満たしていません。 一方で、この質問django form dropdown list of numbers次私は、ドロップダウンリストを作成することができるよ、とそのようないくつかのコードでのビューで選択した値を取得する:

class CronForm(forms.Form): 
    days = forms.ChoiceField(choices=[(x, x) for x in range(1, 32)]) 

def manage_books(request): 
    d = CronForm() 
    if request.method == 'POST': 
     day = request.POST.get('days') 

しかし、私は私のオプションはで以前に保存されたブックになりたいですデータベースであり、予め定義された値ではない。

私が試した他のアプローチは、htmlテンプレートから行うことです。本はここからの景色で描画され

<form> 
    {% for book in list %} 
     <option value="name">{{ book.name }}</option> 
    {% endfor %} 
</form> 

:そこ私は、次のフォームの作成この第二のケースで

l = Books.objects.all().order_by('name') 

ドロップダウンリストに表示される情報は、私が欲しいものですが、私ドン選択した値を取得してビューで使用する方法はわかりません。おそらくjavascript関数を使用していますか?

私の2つの要件は次のとおりです。リスト(ユーザーがDBに保存)に正しい情報を表示し、どの情報が選択されているかを知ることができます。

答えて

27

ModelChoiceFieldを使用してください。

def show_book(request): 
    form = CronForm() 
    if request.method == "POST": 
     form = CronForm(request.POST) 
     if form.is_valid: 
     #redirect to the url where you'll process the input 
     return HttpResponseRedirect(...) # insert reverse or url 
    errors = form.errors or None # form not submitted or it has errors 
    return render(request, 'path/to/template.html',{ 
      'form': form, 
      'errors': errors, 
    }) 

が、あなたはModelFormを使用する必要があり、新しい本を追加するか、いずれかを編集するには:

class CronForm(forms.Form): 
    days = forms.ModelChoiceField(queryset=Books.objects.all().order_by('name')) 

その後、あなたの意見は、それは次のようになります。それは新しいフォームか

book_form = BookForm() # This will create a new book 

または

book = get_object_or_404(Book, pk=1) 
book_form = BookForm(instance=book) # this will create a form with the data filled of book with id 1 
+1

おかげでたくさんだ場合、そのビューに、あなたがチェックしましょう次に、それは私が必要なものです! :) – toni

+0

どのようにhtmlのこのドロップダウンリストフォームを配置しますか、それは通常のフォームと同じですか? –