2011-03-12 105 views
7

我想創建一個表單,在該模型從Queryset加載ModelChoiceField,我想添加一些自定義值到ModelChoiceField爲擴展我已經使用選擇字段,如下所示,但在更新窗體時,得到低於錯誤形式ModelChoiceField查詢集+額外的選擇字段Django形式

表單錯誤: 選擇一個有效的選擇。該選擇不是可用選擇之一。

代碼:

self.fields['lead'] = forms.ModelChoiceField(queryset = Pepole.objects.filter(poc__in  = ('lead','sr.lead'))) 
self.fields['lead2'] = forms.ModelChoiceField(queryset = Pepole.objects.filter(role__in = ('lead','sr.lead'))) 
     choice_field = self.fields['lead']          
     choice_field.choices = list(choice_field.choices) + [('None', 'None')] 
     choice_field = self.fields['lead2']          
     choice_field.choices = list(choice_field.choices) + [('None', 'None')] 

我做錯任何事情錯在這裏?

回答

15

這是行不通的。看看ModelChoiceField如何工作:

try: 
     key = self.to_field_name or 'pk' 
     value = self.queryset.get(**{key: value}) 
    except self.queryset.model.DoesNotExist: 
     raise ValidationError(self.error_messages['invalid_choice']) 
    return value 

你不能隨機添加東西。

改爲使用ChoiceField並自定義處理數據。

class TestForm(forms.Form): 
    mychoicefield = forms.ChoiceField(choices=QS_CHOICES) 

    def __init__(self, *args, **kwargs): 
     super(TestForm, self).__init__(*args, **kwargs) 
     self.fields['mychoicefield'].choices = \ 
      list(self.fields['mychoicefield'].choices) + [('new stuff', 'new')] 

    def clean_mychoicefield(self): 
     data = self.cleaned_data.get('mychoicefield') 
     if data in QS_CHOICES: 
      try: 
       data = MyModel.objects.get(id=data) 
      except MyModel.DoesNotExist: 
       raise forms.ValidationError('foo') 
     return data 
1

你有一個Person對象,pk'None'嗎?

我認爲你應該使用

self.fields['lead'] = forms.ModelChoiceField(queryset = Pepole.objects.filter(poc__in  = ('lead','sr.lead')), empty_label="None") 
self.fields['lead2'] = forms.ModelChoiceField(queryset = Pepole.objects.filter(role__in = ('lead','sr.lead')), empty_label="None") 

編輯:

由於您使用的是modelchoicefield,我會認爲,所有你的選擇是,要麼是模型類型或沒有的。

您可以通過修改查詢集「擴展」這種類型的選擇,你傳入構造爲modlechoicefield,如:

qs = People.objects.filter(poc__in = ('lead','sr.lead')) 
ext = People.objects.filter(role__in = ('lead', 'sr.lead')) 

qs = qs | ext 

self.fields['lead'] = forms.ModelChoiceField(queryset = qs, empty_label='None') 
or for updating 
self.fields['lead'].queryset = qs 

這個問題談到了modelchoicefield一點,可能會感興趣的你:

How do I filter ForeignKey choices in a Django ModelForm?

+0

沒有,加入empty_label =「無」,也何嘗不是working.here我的問題太從查詢集擴展的選擇,選擇選項後 – sush 2011-03-12 09:40:54

3

看來你只是想允許這些表單域是可選的。不要讓自己難過。請參閱the documentation關於根據需要標記表單域。

lead = forms.ModelChoiceField(queryset=People.objects.filter(poc__in=('lead', 'sr.lead')), required=False) 
相關問題