2011-03-12 67 views
7

Estoy tratando de crear un formulario en el que cargas de ModelChoiceField desde queryset y quiero agregar algunos valores personalizados a ModelChoiceField para extender he utilizado el campo de elección, como a continuación pero al actualizar el formulario, consiguiendo debajo de errorformularios ModelChoiceField queryset + campos de elección extra django forms

Error de forma: Seleccione una opción válida. Esa elección no es una de las opciones disponibles.

Código:

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

estoy haciendo algo mal aquí?

Respuesta

15

Eso no va a funcionar. Mira cómo funciona un ModelChoiceField:

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 

No se puede añadir algo al azar a ella.

En su lugar, utilice un ChoiceField y personalice los datos.

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

¿Tiene un objeto Persona con pk 'None'?

Creo que usted debe utilizar

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

edición:

Puesto que usted está usando un modelchoicefield, yo creo que todas sus opciones serían ya sea de ese tipo de modelo o ninguno.

Usted puede "extender" las opciones de ese tipo mediante la modificación del conjunto de consultas se pasa al constructor para la modlechoicefield, por ejemplo:

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 

conversaciones esta pregunta sobre el modelchoicefield un poco y puede ser de su interés que:

How do I filter ForeignKey choices in a Django ModelForm?

+0

No, después de agregar empty_label = "None" también no funciona. Aquí mi pregunta es también extiende la elección de queryset para seleccionar la opción – sush

3

Parece que solo desea permitir que los campos de formulario sean opcionales. No te lo pongas difícil a ti mismo. Consulte the documentation para marcar un campo de formulario según sea necesario.

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