1

これは私の以前の質問に関連しています。

Choice および TextInput ウィジェットを含む MultiValueField が必要です。ユーザーが Choice から「OTHER」を選択した場合、TextInput の値を保存する必要があります。それ以外の場合は、Choice の値を保存する必要があります。これまでのところ、次のコードがあります。

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()

ただし、TextInput に値が含まれていないものを保存しようとすると、「このフィールドは必須です」という検証エラーが発生します。これは、上記の「required=False」kwarg にもかかわらずです。

clean 関数にいくつかのロジックを追加しようとしました。Choice ウィジェットの値が「OTHER」の場合、TextInput のウィジェットを無視します。

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)

しかし、これは効果がありません。

助言がありますか?

4

1 に答える 1

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)
于 2012-05-07T14:13:31.413 に答える