2017-11-23 15 views
0

私は本当にDjangoの新機能です!私はそれらの隣にチェックボックスがある項目を表示するページを持っています。アイテム/チェックボックスの数はさまざまです。ボタンを押すと、対応するチェック項目が変更されます。複数のチェックボックスを持つDjangoフォーム

はこれまでのところ、私は1つの形でそれをすべてをラップしようとしている:

<form method="post"> 
{% csrf_token %} 
{% for event in items %} 
    {{ event.eventID }} 
    <input type="checkbox" value="{{ event.eventID }}" name="choices"> 
{% endfor %} 
<button type="submit">Approve</button> 
</form> 

私はDjangoのフォームフィールドでそれらを収集します。私はModelMultipleChoiceFieldを使用しようとしています:

class ApproveEventForm(forms.Form): 
    choices = forms.ModelMultipleChoiceField(queryset = Event.objects.all(), widget=forms.CheckboxSelectMultiple()) 

そして、私の意見では、私が選択した項目を編集したい:

def approve_event(request): 
if request.method == "POST": 
    form = ApproveEventForm(request.POST) 
    print(form.errors) 
    if form.is_valid(): 
     for item in form.cleaned_data['choices']: 
      item.approved = True 
      item.save() 
else: 
    form = ApproveEventForm() 
    unapproved = Event.objects.filter(approved=False) 
    return render(request, 'app/approve_event.html', {'items': unapproved, 'form': form}) 

は私のフォームは有効とform.errorsプリントではありません。選択肢" "ではありません主キーの有効な値
どうすればこの問題を解決できますか?または、選択したアイテムにアクセスする別の方法がありますか?

編集:フォームをテンプレートに渡しました。

+0

あなたのフォームをテンプレートに送信してみませんか?コンテキスト= {'フォーム':フォーム}。私は個人的に一度だけビューの最初にフォームをインスタンス化する:form = ApproveEventForm(request.POSTまたはNone)、それを2回インスタンス化する必要はありません。 –

答えて

0

ModelMultipleChoiceFieldの代わりにMultipleChoiceFieldを使用して修正することを管理しました。次に、既存のイベントIDを選択肢に入力し、それをテンプレートに渡します。フォームで

:ビューで

choices = forms.MultipleChoiceField(widget = forms.CheckboxSelectMultiple()) 

form.fields['choices'].choices = [(x.eventID, "Event ID: " + x.eventID) for x in unapproved] 

もイベントオブジェクトを検索し、編集するためのロジックの一部を変更しなければなりませんでした。

関連する問題