1

ユーザーがデバイスの一部を削除できるようにすることを望んで、djangoでフォームを作成しています。フォームの送信ボタンをクリックすると、メッセージが表示され続けます: Select a valid choice. <Some choice> is not one of the available choices. これが私のコードです。どうもありがとう :)

フォーム.py

class DeleteDeviceForm(forms.Form):
    devices = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple)

ビュー.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,})

注意: このフォームのモデルはありません

4

3 に答える 3

2

@ダニエル・ローズマンのおかげで、私はそれを理解することができました.

コードを変更した方法は次のとおりです。

フォーム.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)]

ビュー.py

1行だけを次のように変更しました:

deletedeviceform = DeleteDeviceForm(request.POST, user=request.user.profile.pk)
于 2016-07-14T21:44:37.283 に答える
2

GET 要求でのみ有効な選択肢のリストを設定しました。POST では選択肢がないため、フィールドが有効になることはありません。

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

于 2016-07-14T20:21:57.130 に答える