我在我的一个模型中使用来自Django的localflavor的USStateField():
class MyClass(models.Model):
state = USStateField(blank=True)
然后我从那个班级做了一个表格:
class MyClassForm(forms.ModelForm):
class Meta:
model = MyClass
当我显示表单时,字段“State”是一个下拉框 “阿拉巴马州”预选。
有没有办法让下拉框显示没有预选 价值呢?
答案 0 :(得分:9)
这似乎是一个已知的问题(虽然我不知道机票 - 我会仔细检查那里没有票,如果没有,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))
以上代码来自here。
答案 1 :(得分:3)
我真的不喜欢手动将-----插入列表的想法。当该字段设置为空白= True时,空白选项应自动显示在选项列表的顶部。另外,如果您的州字段位于个人资料中并且您正在使用django-profiles,那么您最终必须修改可重复使用的应用程序。
我发现只需将文件contrib / localflavor / us / us_states.py中的STATE_CHOICES元组复制到项目中的constants.py中,然后复制到models.py中,就会更简单,更清晰:
import constants
state = models.CharField(blank=True, max_length=2, choices=constants.STATE_CHOICES)
然后,blank = True选项可以按预期工作,而无需对列表进行monkeypatch。
答案 2 :(得分:3)
只是报告这是固定的!另请注意,localflavor为now a third-party package,安装后(例如pip install django-localflavor
)可以像这样使用:
from localflavor.us.us_states import STATE_CHOICES
from localflavor.us.models import USStateField
class MyClass(models.Model):
state = USStateField(choices=STATE_CHOICES)
答案 3 :(得分:2)
一个简单的解决方案:
from localflavor.us.us_states import STATE_CHOICES
STATE_CHOICES = (('', '---------'),) + STATE_CHOICES
答案 4 :(得分:1)
以下hack似乎也适用于django admin和视图中定义的表单:
from django.contrib.localflavor.us.us_states import STATE_CHOICES
USStateField.choices = STATE_CHOICES
这里的事实是contrib / localflavor / us / forms.py中的forms.py定义有一个USStateSelect小部件,它确实将选项定义为STATE_CHOICES。但是,contrib / localflavor / us / models.py中的模型未定义这些选项。这样,空白=字段的真实设置不会在Select中产生正确的空白第一个条目,我发现看了db / models / fields / init .py。
另一种解决方法是更改contrib / localflavor / us / models.py并添加如下构造函数:
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.