2009-12-02 3 views
9

Io uso USStateField() da localflavor di Django in uno dei miei modelli:C'è un modo per rendere USStateField() di Django per non avere un valore preselezionato?

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

Poi ho fatto un modulo da quella classe:

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

Quando ho visualizzare il modulo, il campo "Stato" è una casella a discesa con "Alabama" preselezionata.

Esiste un modo per rendere la casella a discesa non mostrare alcun valore pre-selezionato ?

risposta

9

Questo sembra essere un problema noto (anche se non sono a conoscenza di un biglietto - mi piacerebbe doppio controllo non c'è un biglietto per esso, e se 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)) 

Sopra codice da here.

+0

Grazie tante, questo è la cosa che stavo cercando. – MegaBytes

3

Non mi piace molto l'idea di inserire ----- nell'elenco manualmente. Quando il campo è impostato su vuoto = Vero, l'opzione vuota dovrebbe apparire automaticamente nella parte superiore dell'elenco di selezione. Inoltre, se il tuo campo di stato è su Profile e stai usando i profili di Django, allora finisci nella posizione di dover modificare un'app riutilizzabile.

Trovo più facile e più pulito per copiare il tupla STATE_CHOICES dal file contrib/localflavor/us/us_states.py nella constants.py nel mio progetto, e poi in models.py:

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

L'opzione vuoto = True funziona come previsto senza dover monkeypatch l'elenco.

1

Il seguente trucco sembra funzionare sia in amministrazione Django e forme definite in vista:

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

La cosa qui è che la definizione forms.py in contrib/localflavor/us/forms.py ha un Widget USStateSelect che definisce le scelte come STATE_CHOICES. Tuttavia, il modello in contrib/localflavor/us/models.py non definisce queste scelte. In questo modo, vuoto = Le vere impostazioni per il campo non danno come risultato una vuota prima voce nella selezione, ho scoperto guardando db/models/fields/init .py.

una correzione alternativa è quella di cambiare contrib/localflavor/us/models.py e aggiungere un costruttore come questo:

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

Vedere anche http://code.djopoproject.com/ticket/10969 –

3

Proprio riferendo che questo è fisso! Si noti inoltre che è localflavornow a third-party package e dopo l'installazione (ad esempio pip install django-localflavor) può essere utilizzato in questo modo:

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 soluzione semplice:

from localflavor.us.us_states import STATE_CHOICES 


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