【问题标题】:Is there any way to make Django's USStateField() to not have a pre-selected value?有没有办法让 Django 的 USStateField() 没有预选值?
【发布时间】:2009-12-02 05:47:41
【问题描述】:

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

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

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

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

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

有什么办法可以让下拉框不显示预选 到底值不值?

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    这似乎是一个已知问题(虽然我不知道有票 - 我会仔细检查是否没有票,如果没有,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

    【讨论】:

    • 非常感谢,这就是我正在寻找的东西。
    【解决方案2】:

    我不太喜欢手动将 ----- 插入列表的想法。当该字段设置为空白=True 时,空白选项应自动出现在选项列表的顶部。另外,如果您的 state 字段在 Profile 上并且您正在使用 django-profiles,那么您最终将不得不修改可重用的应用程序。

    我发现将 STATE_CHOICES 元组从文件 contrib/localflavor/us/us_states.py 复制到我的项目中的 constants.py 中,然后复制到 models.py 中更简单、更简洁:

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

    blank=True 选项随后会按预期工作,而无需对列表进行猴子补丁。

    【讨论】:

      【解决方案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)
      

      【讨论】:

        【解决方案4】:

        一个简单的解决方案:

        from localflavor.us.us_states import STATE_CHOICES
        
        
        STATE_CHOICES = (('', '---------'),) + STATE_CHOICES
        

        【讨论】:

          【解决方案5】:

          以下 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 中的模型并没有定义这些选择。这样,该字段的空白 = True 设置不会导致 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.
          

          【讨论】:

            猜你喜欢
            • 2023-02-14
            • 2020-03-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-06-20
            • 1970-01-01
            • 2015-08-13
            相关资源
            最近更新 更多