2010-09-13 18 views
19

Sorgulama filtresi oluşturmak için kullandığım bir form var. Form, proje durum seçeneklerinde veritabanından çeker. Ancak, ben "Bütün canlı promosyonlar" örneğin, ek seçenekler eklemek istedim ... böylece seçme kutusu gibi görünecektir: *Django form seçme widget'ına yeni seçenekler ekleyin

  • Tüm Promosyonlar
  • Tüm Canlı Promosyonlar *
  • Taslak
  • İşaretli Bildirilen Kabul Ekleyen
  • Tüm Komplet ed Promosyonlar *
  • İşte

İptal Kapalı '*' ı eklemek istiyoruz olanlar ve diğerleri veritabanından geliyor.

Bu mümkün mü?

class PromotionListFilterForm(forms.Form): 
    promotion_type = forms.ModelChoiceField(label="Promotion Type", queryset=models.PromotionType.objects.all(), widget=forms.Select(attrs={'class':'selector'})) 
    status = forms.ModelChoiceField(label="Status", queryset=models.WorkflowStatus.objects.all(), widget=forms.Select(attrs={'class':'selector'})) 
    ... 
    retailer = forms.CharField(label="Retailer",widget=forms.TextInput(attrs={'class':'textbox'})) 

cevap

30

Bunun için bir ModelChoiceField kullanamazsınız. Standart bir ChoiceField'a dönmeniz ve formun __init__ yönteminde el ile seçenekler listesini oluşturmanız gerekir. Bir şey gibi:

class PromotionListFilterForm(forms.Form): 
    promotion_type = forms.ChoiceField(label="Promotion Type", choices=(), 
             widget=forms.Select(attrs={'class':'selector'})) 
    .... 

    EXTRA_CHOICES = [ 
     ('AP', 'All Promotions'), 
     ('LP', 'Live Promotions'), 
     ('CP', 'Completed Promotions'), 
    ] 

    def __init__(self, *args, **kwargs): 
     super(PromotionListFilterForm, self).__init__(*args, **kwargs) 
     choices = [(pt.id, unicode(pt)) for pt in PromotionType.objects.all()] 
     choices.extend(EXTRA_CHOICES) 
     self.fields['promotion_type'].choices = choices 

Ayrıca bu ekstra seçenekler yakalamak ve uygun bir şekilde başa çıkmak için formun clean() yönteminde akıllıca bir şey yapmak gerekir.