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のウィジェットを無視します。
提案がありますか?
なるほど! cleanは "圧縮された"値を返す必要があることが分かります。ですから、最後の行を読み返すべきです:return "|" .join(value) – trubliphone
'compress'と' clean'は常に何かを返すべきです。 「このフィールドは必須です」とは、フィールドの第2部分だけではなく、フィールド全体を意味します。 – ilvar