2011-03-12 141 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)