2010-09-13 15 views
19

Tengo un formulario que utilizo para construir un filtro de conjunto de consultas. El formulario extrae las opciones de estado del proyecto de la base de datos. Sin embargo, quería añadir opciones adicionales, por ejemplo "Todas las promociones en vivo" ... por lo que el cuadro de selección sería entonces algo como:Agregue opciones adicionales al widget de selección de formulario de Django

  • Todas las Promociones *
  • todas las promociones en directo *
  • Proyecto
  • Enviado
  • Aceptado
  • Informó
  • A cuadros
  • Todo Complet Promociones ed *
  • Closed
  • Cancelado

Aquí el '*' son los que me gustaría añadir y los otros vienen de la base de datos.

¿Esto es posible?

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

Respuesta

30

No podrá utilizar un ModelChoiceField para eso. Tendrá que volver a un ChoiceField estándar y crear la lista de opciones manualmente en el método __init__ del formulario. Algo así como:

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 

También tendrá que hacer algo inteligente en clean() método de la forma de atrapar esas opciones adicionales y tratar con ellos adecuadamente.

Cuestiones relacionadas