2016-07-14 51 views
1

我正在django中创建一个表单,希望允许用户删除他们的一些设备。当我点击我的表单的提交按钮时,我不断收到消息:Select a valid choice. <Some choice> is not one of the available choices。这是我的代码。非常感谢:)MultipleChoiceField - invalid_choice错误 - 选择一个有效的选项。 SomeChoice不是可用选项之一

forms.py

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,}) 

需要注意的是:我没有一个模型,这种形式

回答

0

感谢@丹尼尔罗斯曼,我弄明白了。

这里是我改变了我的代码:

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

好,谢谢你的建议,这是一个很好的起点! :)但是,我知道我应该有这样的东西, def __init __(self,* args,** kwargs): super(DeleteDeviceForm,self).__ init __(* args,** kwargs) self.queryset = Device.objects.filter(user_id = ????) 我不知道我应该如何让我的用户ID在该窗体内......任何关于如何编码的建议?非常感谢:) – Rose

+1

你需要从视图中传递它,并从* args或** kwargs中获取它。 –

相关问题