2012-01-19 25 views
4

からempty_labelを削除することはできません:私はのModelFormでそれを使用する場合Djangoは - 私は私のモデルのフィールドを持っているTypedChoiceField

TYPES_CHOICES = (
    (0, _(u'Worker')), 
    (1, _(u'Owner')), 
) 
worker_type = models.PositiveSmallIntegerField(max_length=2, choices=TYPES_CHOICES) 

それは「---------」空の値を持っています。 TypedChoiceFieldなので、empty_label属性はありません。したがって、という形式でオーバーライドすることはできません。

"---------"を削除する方法はありますか?

def __init__(self, *args, **kwargs): 
     super(JobOpinionForm, self).__init__(*args, **kwargs) 
     if self.fields['worker_type'].choices[0][0] == '': 
      del self.fields['worker_type'].choices[0] 

EDIT::方法はあまりにも動作しません

は、私はそれがそのように動作させるための管理:

def __init__(self, *args, **kwargs): 
    super(JobOpinionForm, self).__init__(*args, **kwargs) 
    if self.fields['worker_type'].choices[0][0] == '': 
     worker_choices = self.fields['worker_type'].choices 
     del worker_choices[0] 
     self.fields['worker_type'].choices = worker_choices 

答えて

5

モデルフィールドフィールドの.formfield()メソッド内で決定された選択肢を持つモデルフィールドの空のオプション。あなたは、このメソッドのためのDjangoのソースコードを見れば、行は次のようになります。だから、

include_blank = self.blank or not (self.has_default() or 'initial' in kwargs) 

、空のオプションを回避するためのクリーンな方法は、モデルのフィールドにデフォルト値を設定することです:

worker_type = models.PositiveSmallIntegerField(max_length=2, choices=TYPES_CHOICES, 
               default=TYPES_CHOICES[0][0]) 

それ以外の場合は、フォームの__init__メソッドでフォームフィールドの.choices属性を手動でハッキングする必要があります。

0

試してみてください。

def __init__(self, *args, **kwargs): 
    super(JobOpinionForm, self).__init__(*args, **kwargs) 
    self.fields['worker_type'].empty_value = None 

https://docs.djangoproject.com/en/1.3/ref/forms/fields/#typedchoicefield

+0

これは機能しません。私は私のポストを編集し、作業の解決策を貼り付けました。それが最高かどうかわからない。 – tunarob

+0

興味深い。私はempty_valueのユースケースが何であるのだろうかと思っています:) – Brandon

+0

私は分かりません。印刷すると空のデータが得られますが、現場では "-------"と表示されます。それ以外の何かに設定する:self.fields ['worker_type']。empty_value = '何も'も動作しません:) – tunarob

1

self.fields['xxx'].empty_value = NoneフィールドタイプがTypedChoiceFieldであり、empty_labelプロパティを持たない場合。 最初に選択したものを削除するにはどうすればよいですか。

関連する問題