2010-09-13 27 views
19

Tôi có một biểu mẫu mà tôi sử dụng để xây dựng bộ lọc truy vấn. Biểu mẫu này kéo các tùy chọn trạng thái dự án từ cơ sở dữ liệu. Tuy nhiên, tôi muốn thêm tùy chọn bổ sung, ví dụ như "Tất cả các chương trình khuyến mãi trực tiếp" ... nên chọn hộp sau đó sẽ giống như thế:Thêm các tùy chọn bổ sung cho biểu mẫu chọn Django

  • Tất cả các chương trình khuyến mãi *
  • Tất cả các chương trình khuyến mãi Live *
  • Dự thảo
  • Đăng
  • Được chấp nhận
  • Báo cáo
  • Checked
  • Tất cả complet Khuyến mãi ed *
  • đóng
  • hủy

Ở đây, '*' là những cái tôi muốn thêm và những người khác đến từ các cơ sở dữ liệu.

Điều này có khả thi không?

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

Trả lời

30

Bạn sẽ không thể sử dụng ModelChoiceField cho điều đó. Bạn sẽ cần phải hoàn nguyên về một ChoiceField tiêu chuẩn và tạo danh sách tùy chọn theo cách thủ công theo phương thức __init__ của biểu mẫu. Một cái gì đó như:

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 

Bạn cũng sẽ cần phải làm một cái gì đó thông minh trong phương pháp clean() của hình thức để đón những tùy chọn bổ sung và đối phó với chúng một cách thích hợp.

Các vấn đề liên quan