2012-01-10 23 views
22

he creado un modelo con una clave externa en ella:Django, ¿cómo eliminar la opción en blanco del campo de elección en forma de modelo?

class Book(models.Model): 
    library = models.ForeignKey(Library, null=False, blank=False) 
    ... 

y luego he creado un formulario con un ModelForm para mostrar a los usuarios:

class BookSubmitForm(ModelForm): 
    class Meta: 
     model = Book 

y cuando puedo mostrar la página con el formulario Obtengo las opciones de la Biblioteca pero también la opción en blanco (--------) que viene por defecto.

Pensé que tener null = False y blank = False en el modelo que eliminaría esa opción en blanco en el ModelForm pero no. ¿Qué puedo hacer para tener solo las opciones reales en la lista y no esa?

Respuesta

26

Ver ModelChoiceField. Debes establecer Empty_label en None. Por lo que su código será algo como:

class BookSubmitForm(ModelForm): 
    library = ModelChoiceField(queryset=Library.objects, empty_label=None) 

    class Meta: 
     model = Book  

EDITAR: se ha cambiado el nombre del campo a minúsculas

+0

De alguna manera funciona, pero todavía veo la ChoiceField original en la forma con la opción en blanco junto con el nuevo con la misma etiqueta y las mismas opciones, pero sin el espacio en blanco elección. Parece que este método no anula el formulario, sino que lo expande con el mismo campo. – Bastian

+0

Ok mi mal, era un error tipográfico, utilicé una primera letra mayúscula como en su ejemplo "Biblioteca". Al cambiar a una "biblioteca" minúscula, en realidad anula el campo. ¡Gracias! – Bastian

+0

¡Genial! También puede simplemente 'self.fields ['library']. Empty_label = None' si no va a cambiar el queryset. – guival

6

Si especifica blank=False y default=<VALUE> en la definición de campo modelo de Django no deja a la elección blanco de forma predeterminada; Tenga en cuenta que el valor predeterminado puede ser una opción no válida y establecerse en '' o cualquier invalid choice por ejemplo.

class Book(models.Model): 
    library = models.ForeignKey(Library, null=False, blank=False, default='') 
    ... 
+0

Cambiar el modelo solo para ajustarse al formulario no parece correcto. Esto solo debe hacerse si tiene sentido que su modelo se comporte de esta manera. – guival

7

Si utiliza ModelForm entonces no tiene que especificar queryset, se requiere, etiquetas, etc, pero la respuesta upvoted hay que hacerlo de nuevo.

En realidad se puede hacer esto para evitar la re-especificación de todo

class BookSubmitForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(BookSubmitForm, self).__init__(*args, **kwargs) 
     self.fields['library'].empty_label = None 

    class Meta: 
     model = Book 
+0

De alguna manera, esto no funciona para mí. Sigo viendo "---------" como una de las opciones si establece empty_label = None como se indicó anteriormente. ¿Sigue siendo válido para Django 1.10? – Anupam

+0

En realidad, pensé que era un TypedChoiceField y, por lo tanto, la respuesta de @Mithril a continuación funcionó. – Anupam

8

self.fields['xxx'].empty_label = None no funcionaría Si tipo de campo es TypedChoiceField que no tienen empty_label propiedad. ¿Qué tenemos que hacer es quitar primera opción:

class BookSubmitForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(BookSubmitForm, self).__init__(*args, **kwargs) 

     for field_name in self.fields: 
      field = self.fields.get(field_name) 
      if field and isinstance(field , forms.TypedChoiceField): 
       field.choices = field.choices[1:] 
Cuestiones relacionadas