2012-07-21 13 views
6

Tengo un choiceField para crear un campo de selección con algunas opciones. Algo como esto:Uso del campo de elección dinámico en Django

forms.py 
    class NewForm(forms.Form): 
     title = forms.CharField(max_length=69) 
     parent = forms.ChoiceField(choices = CHOICE) 

Pero yo quiero ser capaz de crear las opciones sin tener una tupla predefinida (que es requerido por ChoiceField). Básicamente, necesito tener acceso a request.user para completar algunas etiquetas de opciones de acuerdo con cada usuario, pero no sé si hay alguna forma de usar la solicitud en las clases de formularios. Formulario.

Una alternativa sería la de rellenar previamente la instancia de NewForm a través de:

views.py 
form = NewForm(initial={'choices': my_actual_choices}) 

pero tengo que añadir una OPCIÓN ficticia para crear no parece NewForm y my_actual_choices a trabajar de todos modos.

Creo que una tercera forma de resolver esto es crear una subclase de ChoiceField y redefinir save(), pero no estoy seguro de cómo hacerlo.

Respuesta

7

Puede rellenar dinámicamente reemplazando el init, básicamente, el código se verá así:

class NewForm(forms.Form): 
    def __init__(self, choices, *args, **kwargs): 
     super(NewForm, self).__init__(*args, **kwargs) 
     self.fields["choices"] = forms.ChoiceField(choices=choices) 

NewForm(my_actual_choices) o NewForm(my_actual_choices, request.POST, request.FILES) etc.

+0

Sí, eso funciona. Gracias –

+1

'super()' debe ser lo primero. – Surya

+0

Estaba confundido cuando vi 'super()' antes del constructor, pero cuando lo probé, recibí un error: el nombre 'self' no está definido. 'super()' tiene que estar en el constructor. Mirando el historial de edición, creo que eso es lo que Surya quiso decir, ya que 'super()' era originalmente la última línea del constructor. – user2233706

Cuestiones relacionadas