2009-12-02 5 views
9

benim modellerinden birini Django'nın localflavor dan USStateField() kullanın:Django'nun USStateField() öğesini önceden seçilmiş bir değere sahip olmamasını sağlamanın bir yolu var mı?

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

Ben formunu görüntülediğimizde, tarla "Devlet": O sınıftan bir form yapılmış Sonra

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

Ön seçimli "Alabama" içeren bir açılır kutu.

hiç önceden seçilmiş değeri göstermek için açılır kutuyu yapmak için herhangi bir yolu var mı?

cevap

9

Bu bilinen bir sorun gibi görünüyor (Bir bilet farkında değilim gerçi - Ben orada bunun için bir bilet değil ve eğer, file it kez daha kontrol ediyorum):

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

Üstü here'dan kod.

+0

Çok teşekkür ederim, ben arıyordum bir şey. – MegaBytes

3

el listeye ----- ekleme fikri gibi değil gerçekten. Alan boş = True olarak ayarlandığında, boş seçenek otomatik olarak listenin en üstünde görünmelidir. Ayrıca, eyalet alanınız Profil üzerindeyse ve django-profilleri kullanıyorsanız, yeniden kullanılabilir bir uygulamayı değiştirmek zorunda kaldığınız yerde sona erersiniz.

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

Ben localflavor/tr/projemde constants.py içine us_states.py ve sonra models.py içinde/daha kolay ve sadece dosya contrib gelen STATE_CHOICES tuple kopyalamak için temizleyici bulmak

Boş = True seçeneği, listeyi maymun bırakmak zorunda kalmadan beklendiği gibi çalışır.

aşağıdaki kesmek de görünümlerinde tanımlanan hem Django yönetici ve formlarda iş gibi görünüyor
1

:

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

burada şey Contrib/localflavor/tr/forms.py içinde forms.py tanım bir olmasıdır STATE_CHOICES olarak seçimleri tanımlayan USStateSelect widget'ı. Ancak, contrib/localflavor/tr/models.py model bu seçimler tanımlamaz. Bu şekilde, alan için boş = Doğru ayarları seç uygun bir boş ilk girişi sonuçlanmayan, ben db/modeller/alanlar/init .py bakarak öğrendim.

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

Ayrıca bkz http://code.djangoproject.com/ticket/10969 –

3

Sadece bu sabit olduğunu bildiren:

alternatif düzeltme Contrib/localflavor/bizi/models.py değiştirebilir ve bunun gibi bir kurucu eklemektir! Ayrıca localflavornow a third-party package olduğuna dikkat ve yükledikten sonra (örneğin pip install django-localflavor) böyle kullanılabilir:

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


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

Basit bir çözüm:

from localflavor.us.us_states import STATE_CHOICES 


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