2011-07-19 10 views
3

CharFieldにチェックボックスのセットと他の[指定してください]オプションの結果を入れる必要があります(値は 'option-a 、他の 'フォームの状態の下に)。フォームは基本的にのように見えることができます:私はなMultipleChoiceFieldのサブクラス実装することにより、そこに道のほとんどを得ることができた複数(チェックボックス)を実装するDjangoで+ "Other"ウィジェットを選択

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

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

:私のフォームクラスで

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 
) 

これは、適切にフォームをレンダリングし、私のカスタムクリーン()メソッドが呼び出されたが、私は、フォームを保存するとき、私は、検証エラーが表示されます。

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

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

+0

類似のものを修正するのに役立つ記事があります。この記事の主な変更点は、別のウィジェットをサブクラス化することです。 [記事。](http://garmoncheg.blogspot.com/2014/05/implementing-multiple-radio-select.html) – garmoncheg

答えて

0

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

+0

私はvalidate()とvalid_value()をオーバーライドしました:https://gist.github。 com/3327b22ecdc0f8abca8fしかし、私はまだ検証エラーを取得しています。他のバリデーションをショートカットする方法はありますか? –

+1

コードを掘り下げる。あなたが得ているエラーメッセージは、そのように表現されたコードには現れません。他のクラスは何とかそれをキャッチしていますか?検証エラーをキャッチしてトレースバックをダンプして、どこから来ているのかを正確に確認できます。 – emperorcezar

1

あなたがいるかどうかを確認、フォームのうち、モデルインスタンスを保存すると、エラーがのみ発生すると、エラーの代わりにフォームモデル検証から来ている「バリューu'education、他の」は有効な選択肢ではありません」検証。自由形式の文字列を実際に保存するときに、モデルフィールドにchoicesも設定していると、この問題が発生します。

関連する問題