有没有办法让Django的USStateField()没有预先选择的值?

时间:2009-12-02 05:47:42

标签: django django-models django-forms

我在我的一个模型中使用来自Django的localflavor的USStateField():

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

然后我从那个班级做了一个表格:

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

当我显示表单时,字段“State”是一个下拉框 “阿拉巴马州”预选。

有没有办法让下拉框显示没有预选 价值呢?

5 个答案:

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

只是报告这是固定的!另请注意,localflavornow 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.