3

チェックボックスのセットと「その他」[指定してください] オプションの結果を CharField に入力する必要があります (以下のフォーム状態の場合、値は「option-a,other」になります)。フォームは基本的に次のようになります。

[x] option a
[ ] option b
[x] other

If you selected "other", please specify. [__________]

MultipleChoiceField のサブクラスを実装することで、ほとんどの方法でそこにたどり着くことができました。

class CommaStringMultipleChoiceField(MultipleChoiceField):
    def to_python(self, value):
        return [val.rstrip().lstrip() for val in value.split(',')]

    def clean(self, value):
        return ",".join([val.rstrip().lstrip() for val in value])

私のフォーム クラスでは、そのフィールドをフォーム フィールドに割り当てます。

TYPE_CHOICES = [
    (u'option-a',u"Option A"),
    (u'option-b',u"Option B"),
    (u'other', u"Other"),
]

type = CommaStringMultipleChoiceField(
    choices=TYPE_CHOICES,
    widget=CheckboxSelectMultiple
)

これによりフォームが適切にレンダリングされ、カスタムの clean() メソッドが呼び出されますが、フォームを保存すると検証エラーが発生します。

Value u'education,other' is not a valid choice.

カスタムバリデーターを追加して遊んでみましたが、今のところ違いはありません。何が欠けていますか?

4

2 に答える 2

1

エラーはモデル インスタンスをフォームから保存した場合にのみ発生するため、「Value u'education,other' is not a valid choice」エラーがフォーム検証ではなくモデル検証から発生しているかどうかを確認してください。これは、本当に自由形式の文字列をそこに格納したいときに、モデル フィールドにもセットがある場合に発生する可能性があります。choices

于 2011-07-19T21:53:50.987 に答える
0

おそらく、クラスの Validate メソッドをオーバーライドする必要があります。https://code.djangoproject.com/browser/django/trunk/django/forms/fields.py#L682のコードで、エラー メッセージが発生している場所がわかります。

于 2011-07-19T14:12:32.257 に答える