2009-12-02 11 views
9

utilizo USStateField() desde localflavor de Django en uno de mis modelos:¿Hay alguna manera de hacer que USStateField() de Django no tenga un valor preseleccionado?

class MyClass(models.Model): 
    state = USStateField(blank=True) 

Entonces hice una forma de esa clase:

class MyClassForm(forms.ModelForm): 
    class Meta: 
     model = MyClass 

Cuando mostrar el formulario, el campo "Estado" es un cuadro desplegable con "Alabama" preseleccionado.

¿Hay alguna manera de hacer que el cuadro desplegable no muestre ningún valor preseleccionado de ?

Respuesta

9

Esto parece ser un problema conocido (aunque no estoy al tanto de un billete - Me vuelva a comprobar que no hay una entrada para él, y si no, file it):

from django.contrib.localflavor.us.us_states import STATE_CHOICES 
from django.contrib.localflavor.us.forms import USStateField 

class YourModelForm(forms.ModelForm): 
    class Meta: 
     ... 

    YOUR_STATE_CHOICES = list(STATE_CHOICES) 
    YOUR_STATE_CHOICES.insert(0, ('', '---------')) 
    state = USStateField(widget=forms.Select(
      choices=YOUR_STATE_CHOICES)) 

Por encima código desde here.

+0

Muchas gracias, eso es lo que estaba buscando. – MegaBytes

3

No me gusta la idea de insertar ----- en la lista manualmente. Cuando el campo se establece en blanco = Verdadero, la opción en blanco debe aparecer en la parte superior de la lista de selección automáticamente. Además, si su campo de estado está en Profile y está usando django-profiles, entonces estará en la posición de tener que modificar una aplicación reutilizable.

Me resulta más fácil y más limpio para copiar sólo la tupla STATE_CHOICES del contrib archivo/localflavor/es/us_states.py en el constants.py en mi proyecto, y luego en models.py:

import constants 
state = models.CharField(blank=True, max_length=2, choices=constants.STATE_CHOICES) 

La opción en blanco = Verdadero funciona como se esperaba sin tener que parchear la lista.

1

este truco también parece funcionar tanto en las formas de administración de Django y definido en las vistas:

from django.contrib.localflavor.us.us_states import STATE_CHOICES 
USStateField.choices = STATE_CHOICES 

La cosa aquí es que la definición forms.py en contrib/localflavor/es/forms.py tiene una Objeto USStateSelect que define las opciones como STATE_CHOICES. Sin embargo, el modelo en contrib/localflavor/us/models.py no define estas opciones. De esta forma, en blanco = Las configuraciones verdaderas para el campo no dan como resultado una primera entrada en blanco adecuada en el Seleccionar, descubrí mirando db/models/fields/init .py.

Una solución alternativa es cambiar contrib/localflavor/es/models.py y añadir un constructor de esta manera:

class USStateField(Field): 
    def __init__(self, *args, **kwargs): 
     from us_states import STATE_CHOICES 
     kwargs.setdefault('max_length', 2) 
     kwargs.setdefault('choices', STATE_CHOICES) 
     super(USStateField, self).__init__(*args, **kwargs) 
    # etc. etc. 
+0

Véase también http://code.djangoproject.com/ticket/10969 –

3

sólo un informe de que este se fija! También tenga en cuenta que es localflavornow a third-party package y después de la instalación (por ejemplo pip install django-localflavor) que puede ser utilizado como esto:

from localflavor.us.us_states import STATE_CHOICES 
from localflavor.us.models import USStateField 


class MyClass(models.Model): 
    state = USStateField(choices=STATE_CHOICES) 
2

Una solución simple:

from localflavor.us.us_states import STATE_CHOICES 


STATE_CHOICES = (('', '---------'),) + STATE_CHOICES 
Cuestiones relacionadas