2011-03-12 25 views
7

ModelChoiceField öğelerinde queryset'ten bir form oluşturmaya çalışıyorum ve genişletmek için ModelChoiceField'a birkaç özel değer eklemek istiyorum. aşağıdaki hata oluşuyorformlar ModelChoiceField queryset + extra seçim alanları django formları

Form Error: Geçerli bir seçim yapın. Bu seçim mevcut seçeneklerden biri değildir.

Kod: ben yanlış burada herhangi bir şey yapıyor

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')] 

Am?

cevap

15

. Bir ModelChoiceField nasıl çalıştığını bak: Bunu rastgele bir şey ekleyemezsiniz

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 

.

Bunun yerine bir ChoiceField kullanın ve verileri özel olarak işleyin.

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

pk 'Hiçbiri' olan bir Kişi nesnesiniz var mı?

Bir modelchoicefield kullandığınıza göre, ben tüm seçimler bu modelin türü veya hiçbiri birini olacağını düşünürdüm:

i

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") 

düzenlemeyi kullanarak gerektiğini düşünüyorum.

Sen mesela, modlechoicefield için yapıcı geçmesine Sorgu Kümesi değiştirerek bu tür seçimler "genişletmek" olabilir:

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 

bu soru görüşmelerini modelchoicefield hakkında biraz ve ilgisini çekebilecek Eğer: işe gitmiyor

How do I filter ForeignKey choices in a Django ModelForm?

+0

Nope, empty_label = "None" ifadesini ekledikten sonra da çalışmaz. Herhangi bir soru sormak için queryset seçeneğinden çok fazla seçim yapıyorum – sush

3

Bu form alanlarının isteğe bağlı olmasına izin vermek istediğiniz anlaşılıyor. Kendini zorlaştırma. Bir form alanını gerektiği gibi işaretlemekle ilgili olarak bkz. the documentation.

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