マルチフォームウィジェットを使用すると、隠しフィールドを の代わりに _0 _1 などにすることができます。これは、forms.MultiValueField が clean() メソッドで ValidationError() のスローを開始する必要があるまで、すべてうまく機能します。
実際... ValidationError() はフォームエラーを _0 などの代わりに設定します...
代わりに、すべての単一ビューに「if」ラッパーを記述して、このフィールド名をキャッチして _0 に交換します... MultiWidget または MultiValueField でこれを行うことができるよりクリーンな方法はありますか?
MultiValueField clean() 関数内で ValidationError({'myfieldname_0': ['my error',]}) を投げてみましたが、より高いレベルでキャッチされると、「my_error」を self._errors に保存するだけです「myfieldname」ハッシュの下のフォーム (_0 なし)。「site-packages/django/forms/forms.py」でそのようにクリーンアップされているようです とにかく、このアプローチのもう1つの問題は、「myfieldname」をハードコーディングする必要があることです。
要するに、MultiWidget を使用してフォームをシンプルで管理しやすくしたいのですが、このフィールドのハッシュ応答 (フィールド名の末尾) に _0 を追加して、実際の入力レコードと一致させる検証が必要です。これにより、jquery.validation() ( http://jqueryvalidation.org/ ) の統合がはるかに簡単になります。私はまた、悪いデザインを受け入れることにもオープンです...おそらく、MutilWidget shrugs ではなく、MutilValueField が必要なだけです。
以下は、私の問題を設定するサンプルコードです。
from django.forms import MultiWidget
from django.forms import MultiValueField
from django.forms import ModelForm
from django.forms import widgets
class MyWidget(MultiWidget):
"""
"""
def __init__(self, attrs=None, **kwargs):
# Populated once render() is called
self.name = u''
_widgets = (
widgets.TextInput(attrs=attrs),
widgets.HiddenInput(attrs=None),
widgets.HiddenInput(attrs=None),
)
super(MyWidget, self).__init__(_widgets, attrs=None, **kwargs)
def value_from_datadict(self, data, files, name):
return [ widget.value_from_datadict(data, files, name + '_%s' % i)
for i, widget in enumerate(self.widgets)]
class MyFormField(MultiValueField):
"""
Significantly simplified just to show my problem
"""
widget = MyWidget
def clean(self, value):
# I want to some how alter how this exception is thrown so it isn't put in
# the self._errors['<fieldname>'] hash, but instead placed in
# the self._errors['<fieldname>'_0] hash
raise ValidationError(self.error_messages['required'])
class MyForm(ModelForm):
"""
Simple form example of how I'd use the field
"""
class Meta:
model = <some model>
performer = MyFormField(
max_length=100,
required=True,
)