2016-07-14 13 views
1

私はdjangoでフォームを作成しており、ユーザがデバイスの一部を削除できるようにしたいと考えています。私のフォームの送信ボタンをクリックすると、メッセージが表示され続けます:Select a valid choice. <Some choice> is not one of the available choices。ここに私のコードです。どうもありがとう:)MultipleChoiceField - invalid_choiceエラー - 有効な選択を選択します。 SomeChoiceは利用可能な選択の1つではありません

ことを注意
class DeleteDeviceForm(forms.Form): 
    devices = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple) 

views.py

def delete_device(request): 
    if request.method == 'POST': 
     deletedeviceform = DeleteDeviceForm(request.POST) 
     if deletedeviceform.is_valid(): 
      devicelist = request.POST.getlist('devices') 
#will put other stuff there to process the data later, just want to access list now 
      return HttpResponseRedirect('/accounts/loggedin', {"devicelist": devicelist, }) 

    else: #if not a POST request 
     userid = request.user.profile.pk 
     devices = Device.objects.filter(user_id=userid) 
     deletedeviceform = DeleteDeviceForm() 
     deletedeviceform.fields['devices'].choices = [(x.id, x) for x in devices] 

    return render(request, 'userprofile/delete_device.html', {"full_name": request.user.username, "deletedeviceform": deletedeviceform,}) 

forms.py:私はあなたが設定した

答えて

0

@Daniel Rosemanのおかげで、私はそれを理解することができました。ここで

は、私は自分のコードを変更する方法である:

forms.py

class DeleteDeviceForm(forms.Form): 
    devices = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple,label="Select the devices you want to delete:") 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user', None) 
     super(DeleteDeviceForm, self).__init__(*args, **kwargs) 
     self.fields['devices'].choices = [(x.id, x) for x in Device.objects.filter(user_id=user)] 

views.py

に一つだけの行を変更:アドバイス

deletedeviceform = DeleteDeviceForm(request.POST, user=request.user.profile.pk) 
1

このフォームのためのモデルを持っていませんGETリクエストでの有効な選択肢のリストのみ。 POSTでは選択肢がないので、フィールドは決して有効ではありません。

このコードは、フォームの__init__メソッドに入れる必要があるため、フォームがインスタンス化されるたびに実行されます。

+0

[OK]を感謝それは素晴らしい出発点です! :)しかし、私はこれに似て何かを持っている必要があります知っている: def __init __(自己、* args、** kwargs): スーパー(DeleteDeviceForm、自己).__ init __(* args、** kwargs) self.queryset = Device.objects.filter(user_id = ????) 私はそのフォームの中に自分のユーザーIDを取得するはずです...私はこれをどのようにコード化することができますか?ありがとうたくさん:) – Rose

+1

あなたはそれをビューから渡し、* argsか** kwargsから取得する必要があります。 –

関連する問題