2016-07-14 4 views
1

사용자가 일부 장치를 삭제할 수 있도록하기 위해 django에서 양식을 만듭니다. 양식의 제출 버튼을 클릭하면 메시지가 계속 나타납니다 : Select a valid choice. <Some choice> is not one of the available choices. 여기 내 코드가있다. 고마워요 :)MultipleChoiceField - invalid_choice 오류 - 유효한 선택 항목을 선택하십시오. SomeChoice는 사용 가능한 선택 사항 중 하나가 아닙니다.

있습니다
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 덕분에, 나는 그것을 알아낼 수있었습니다. 조언을

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

이 양식에 대한 모델이없는 GET 요청에 대해서만 유효한 선택 목록. POST에는 선택 사항이 없으므로이 필드는 절대로 유효하지 않습니다.

해당 코드는 양식의 __init__ 메서드에 있어야하므로 양식이 인스턴스화 될 때마다 실행됩니다.

+0

확인 감사 : 단 하나 개의 라인 변경

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

forms.py

: 여기

내가 내 코드를 변경하는 방법입니다 , 그것은 좋은 출발점이다! :) 그러나 나는 이것과 비슷한 것을 가지고 있어야한다는 것을 알고있다 : def __init __ (self, * args, ** kwargs) : super (DeleteDeviceForm, self) .__ init __ (* args, ** kwargs) self.queryset = Device.objects.filter (user_id = ????) 내 사용자 ID를 어떻게 얻을 수 있을지 모르겠다 ...이 코드를 어떻게 작성할 수 있을지에 대한 제안이 있으십니까? 고마워요 :) – Rose

+1

당신은보기에서 그것을 전달하고 * args 또는 ** kwargs에서 얻을 필요가있다. –