2
我想讓用戶刪除一個與特定模型關聯的外鍵列表。在提交表單時,ModelChoiceField給出了一個無效的選擇錯誤
說我們有這兩款車型:
class IceBox(models.Model):
...
class FoodItem(models.Model):
name = models.CharField(...)
icebox = models.ForeignKey(IceBox)
def __unicode__(self):
return self.name
用來選擇多個fooditems形式被刪除:
class IceBoxEditForm(forms.Form):
fooditems = forms.ModelChoiceField(queryset=FoodItem.objects.none(), widget=forms.CheckboxSelectMultiple(), empty_label=None)
相應的視圖:
def icebox_edit(request, item=None):
# Grab the particular icebox
icebox = get_object_or_404(IceBox, pk=item)
if request.method == "POST":
form = IceBoxEditForm(request.POST)
print request.POST
if form.is_valid():
# Delete should happen
else:
form = IceBoxEditForm()
# Only use the list of fooditems that this icebox holds
form.fields['fooditems'].queryset = icebox.fooditem_set.all()
return render_to_response('icebox_edit.html', {'form':form},context_instance=RequestContext(request))
形式正確列出與該冰箱相關的食品項目的複選框。然而,當我選擇的東西,然後提交表單,我會得到的形狀誤差:
Select a valid choice. That choice is not one of the available choices.
有我缺少的Django預計其他一些自定義的驗證?
編輯:我已經試過這一點,但它給出了一個語法錯誤:
form:
class IceBoxEditForm(forms.Form):
fooditems = forms.ModelChoiceField(queryset=FoodItem.objects.none(), widget=forms.CheckboxSelectMultiple(), empty_label=None)
def __init__(self, *args, **kwargs):
queryset = kwargs.pop('queryset', None)
super(IceBoxEditForm, self).__init__(*args, **kwargs)
if queryset:
self.fields['fooditems'].queryset = queryset
view:
form = IceBoxEditForm(queryset=icebox.fooditem_set.all(), request.POST) # Syntax error!
....
else:
form = IceBoxEditForm(queryset=icebox.fooditem_set.all())
....
謝謝,我更新的代碼,以反映您的評論。但是,我仍然收到相同的錯誤。 – sharkfin
我想澄清一下,我現在如何將'queryset'傳遞給POST表單?做'form = IceBoxEditForm(queryset = icebox.fooditem_set.all(),request.POST)'給出語法錯誤。 – sharkfin
您必須始終在關鍵字參數前傳遞位置參數。 'form = MyForm(request.POST,queryset = myqueryset)'是你想要的。 –