多表单小部件允许我们将一些隐藏字段设置为 _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”中以这种方式进行了清理。无论如何,这种方法的另一个问题是它需要我对我不想做的“myfieldname”进行硬编码。
简而言之,我想利用 MultiWidget 使表单变得简单且易于管理,但我希望验证在该字段的哈希响应中添加 _0(在字段名称的末尾)以匹配实际输入记录被放入。这使得集成 jquery.validation() ( http://jqueryvalidation.org/ ) 变得更加容易。我也愿意接受糟糕的设计......也许我只需要 MutilValueField 而不是 MutilWidget耸耸肩。
以下是设置我的问题的示例代码:
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,
)