2011-03-13 74 views
8

我希望我的ChoiceField在ModelForm中有一個空白選項(------),但它是必需的。所需的空白選項ChoiceField

我需要空白選項以防止用戶意外跳過該字段,因此選擇了錯誤的選項。

回答

18

這適用於至少1.4及更高版本:

CHOICES = (
    ('', '-----------'), 
    ('foo', 'Foo') 
) 

class FooForm(forms.Form): 
    foo = forms.ChoiceField(choices=CHOICES) 

由於ChoiceField是(默認)要求,其會在被選中的第一選擇抱怨是空的,不會,如果第二。

這樣做比Yuji Tomita表現得更好,因爲這樣你可以使用Django的本地化驗證信息。

+0

這是一個好主意,它避免了寫一些自定義驗證器。 – 2014-11-28 12:45:14

-2

在參數添加空=真

這樣

gender = models.CharField(max_length=1, null = True) 

http://docs.djangoproject.com/en/dev/ref/models/fields/


的評論

THEME_CHOICES = (
    ('--', '-----'), 
    ('DR', 'Domain_registery'), 
) 
    theme = models.CharField(max_length=2, choices=THEME_CHOICES) 
+0

是不是可選字段?我希望它是必需的,但沒有默認值。 – willwill 2011-03-13 13:21:39

+0

THEME_CHOICES =( ( ' - ', '-----) (' DR」, 'Domain_registery'), ) 主題= models.CharField(MAX_LENGTH = 2,選擇= THEME_CHOICES) – Efazati 2011-03-13 13:25:49

6

你可以用驗證字段

CHOICES = (
    ('------------','-----------'), # first field is invalid. 
    ('Foo', 'Foo') 
) 
class FooForm(forms.Form): 
    foo = forms.ChoiceField(choices=CHOICES) 

    def clean_foo(self): 
     data = self.cleaned_data.get('foo') 
     if data == self.fields['foo'].choices[0][0]: 
      raise forms.ValidationError('This field is required') 
     return data 

如果它是一個ModelChoiceField,你可以提供empty_label說法。

foo = forms.ModelChoiceField(queryset=Foo.objects.all(), 
        empty_label="-------------") 

這將保持所要求的形式,如果選擇-----,將拋出一個驗證錯誤。

0

您也可以覆蓋表單的__init__()方法並修改choices字段屬性,重新分配新的元組列表。 (這可能對動態更改有用):

def __init__(self, *args, **kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
    self.fields['my_field'].choices = [('', '---------')] + self.fields['my_field'].choices