2012-05-04 23 views
1

これは私のearlier questionに関連しています。django multivaluefield&multiwidget - オプションを1つ選択してください

ChoiceとTextInputウィジェットを含むMultiValueFieldが必要です。ユーザが選択肢から「その他」を選択すると、TextInputの値を保存する必要があります。それ以外の場合は、選択肢の値を保存する必要があります。これまでのところ私は、次のコードを持っている:私は、TextInputの中に値が含まれていない何かを保存しようとするたび

custom_choices = [("one","one"),("two","two"),("OTHER","OTHER")] 

class MyMultiWidget(forms.MultiWidget): 
    def __init__(self,*args,**kwargs): 
     widgets = (
      forms.Select(choices=custom_choices), 
      forms.TextInput(), 
     ) 
     super(MyMultiWidget, self).__init__(widgets,*args,**kwargs) 

    def decompress(self, value): 
     if value: 
      return value.split("|") 
     return ['', ''] 

class MyMultiValueField(forms.MultiValueField): 
    def __init__(self, *args, **kwargs): 
     fields = (
      forms.CharField(max_length=128,required=True), 
      forms.CharField(max_length=128,required=False), 
     ) 
     super(MyMultiValueField, self).__init__(fields, *args, **kwargs) 
     self.widget = TestMultiWidget() 

    def compress(self, data_list): 
     if data_list: 
      return '|'.join(data_list) 

class MyTestField(models.CharField): 
    def formfield(self, **kwargs): 
     return super(MyTestField, self).formfield(form_class=MyMultiValueField) 

class MyModel(models.Model): 
    myField = MyTestField() 

をしかし、私は「このフィールドは必須です。」検証エラーを取得しますこれは上記の「必須=偽」のkwargにもかかわらずです。

私はいくつかのロジックをclean関数に追加しようとしました。

def clean(self,value): 
    if value[0]!="OTHER": 
     value[1]=u'' 
    else: 
     if not value[1]: 
      msg = "unspecified value" 
      raise forms.ValidationError(msg) 
     elif "|" in value[1]: 
      msg = "bad value ('|' character is not allowed" 
      raise forms.ValidationError(msg) 
    super(TestFormField,self).clean(value) 

をしかし、これは効果がありません:選択ウィジェットの値が「その他」である場合のTextInputのウィジェットを無視します。

提案がありますか?

+0

なるほど! cleanは "圧縮された"値を返す必要があることが分かります。ですから、最後の行を読み返すべきです:return "|" .join(value) – trubliphone

+0

'compress'と' clean'は常に何かを返すべきです。 「このフィールドは必須です」とは、フィールドの第2部分だけではなく、フィールド全体を意味します。 – ilvar

答えて

0

クリーンの正しいバージョンは次のようになりべき:

def clean(self,value): 
    if value[0] != "OTHER": 
     value[1] = u' ' 
    else: 
     if value[1].strip() == u' ': 
      msg = "unspecified value" 
      raise forms.ValidationError(msg) 
     elif "|" in value[1]: 
      msg = "bad value ('|' character is not allowed)" 
      raise forms.ValidationError(msg) 
    return "|".join(value)