2011-01-14 13 views
18

que quieren deshacerse de la "-------------" elección Django agrega en una selección de entrada que representa una clave externa en una ModelFormModelChoiceField, la eliminación de la opción en blanco

Es been answered que puede usar la opción empty_label=none, pero tengo un ModelForm, no un formulario regular y no se permite anular el campo.

sé que puedo reemplazar el método de la ModelForm __init__() con el fin de modificar queryset de un ModelChoiceField usando

self.fields['my_foreign_key'].queryset = .... 

pero esto sería muy feo, ya que esto sucede más de 10 FOREIGN_KEYS en el "principal" modelo, y no hay más que un ModelForm basa en este modelo

todo el contexto:

  • cada uno de estos puntos FOREIGN_KEY a la misma tipo de modelos: son listas particulares de opciones, muchos modelos para facilitar su modificación a través del administrador.
  • todos estos modelos están relacionados con el modelo principal a través de una relación "to_field = code", basado en un Charfield que contiene un código de tres letras (hey, no es mi culpa, tuve que usar un MS Access DB heredado), este CharField tiene las opciones blank=True, unique=True, por lo que podría, por cada lista, crear un registro "---No information yet---" que tiene, se apuesta, un valor en blanco en lugar de un código de tres letras ...

La situación es ahora: me sale un campo de entrada de selección con dos opciones de "valor en blanco": el django uno y el mío, uno después del otro. acabo pierda un 'empty_label = opción none` aquí también ...

+0

creo que se puede redefinir/sobrescribir el campo. Hago esto para cambiar un campo de modelo de DateTime en un formulario TimeField (y agregar un campo adicional de DateField). Luego anulo el método clean() del formulario para combinar los campos de fecha y hora. –

Respuesta

27

Si desea eliminar la opción en blanco para todos ModelChoiceField se podría hacer algo como ..

class Form(forms.ModelForm): 
    class Meta: 
     model = MyModel 

    def __init__(self, *args, **kwargs): 
     super(Form, self).__init__(*args, **kwargs) 
     modelchoicefields = [field for field_name, field in self.fields.iteritems() if 
      isinstance(field, forms.ModelChoiceField)] 

     for field in modelchoicefield: 
      field.empty_label = None 

Pero eso sería reemplazar todos ModelChoiceField s, por lo que tal vez algo más de grano fino como:

for fieldname in ('field1','field2','field3','field4','field5','field6'): 
    self.fields[fieldname].empty_label = None 

ciertamente más fácil que el __init__ sobrescriben se mencionan!

actualización de Moritz

Puede utilizar 2017+ uso:

forms.ModelChoiceField(... empty_label=None 
+0

Eso funciona muy bien Yuji, ojalá pudiera hacer clic diez veces en la flecha ARRIBA. Los modelos no son tan cerrados, pensé que después de todo –

+0

¡Ehehe, lindo! : D –

+0

Puede hacer lo siguiente ahora: '' 'forms.ModelChoiceField (... Empty_label = None)' '' – Moritz

Cuestiones relacionadas