2012-05-28 46 views
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()) 
     .... 

回答

3

你已經改變了查詢集爲一個GET請求領域,而不是一個職位。所以當你提交表單時,Django仍然使用原始的查詢集,所以你的選擇是無效的。

要麼在視圖的開始處更改它,所以它會發生POST和GET,或者甚至更好地在表單的__init__方法中執行。

+0

謝謝,我更新的代碼,以反映您的評論。但是,我仍然收到相同的錯誤。 – sharkfin

+0

我想澄清一下,我現在如何將'queryset'傳遞給POST表單?做'form = IceBoxEditForm(queryset = icebox.fooditem_set.all(),request.POST)'給出語法錯誤。 – sharkfin

+0

您必須始終在關鍵字參數前傳遞位置參數。 'form = MyForm(request.POST,queryset = myqueryset)'是你想要的。 –

相關問題