我得到了表格:
class SearchForm(Form):
owner = ModelMultipleChoiceField(queryset=User.objects.all(), required=False)
并且在自定义相关视图的get_queryset()
之后,它按预期工作但我得到了没有所有者的对象。我想在列表(0,'Without owner')
的顶部添加其他新选项,这样我就可以只过滤没有所有者的对象。
如何添加此选项?
更新:
我在form.__init__
中添加了选项,并为它编写了自定义清理方法,但是如果我选择添加选项,则在进入我的clean方法之前会引发ValidationError
。我猜我必须覆盖form.is_valid
但我不知道怎么做,所以我仍然可以使用默认的is_valid方法。
我的代码
def __init__(self, *args, **kwargs):
super(ClientListSearchForm, self).__init__(*args, **kwargs)
self.fields['owner'].choices = \
list(self.fields['owner'].choices)+[('0', 'n/a')]
def clean_owner(self):
logger.debug('CLEAN_OWNER:')
data = self.cleaned_data.get('owner')
logger.debug('data: %s' % data)
if data == 0:
logger.debug('Data zero - not assigned')
return data
users = User.objects.all()
if all(e in users for e in data):
logger.debug('Data in users - validating ok')
return data
else:
raise ValidationError('Incorrect owner')
我试过了:
def is_valid(self):
try:
super(ClientListSearchForm, self).is_valid()
except ValidationError as e:
logger.debug('val error: %s' % e.args)
但它既不验证也不缓存异常
UPDATE2添加了自定义验证器
def userWithEmpty(value):
users = User.objects.values_list('pk').all()
v =list()
for va in value:
v.append(int(va))
u = list()
for us in users:
u.append(int(us[0]))
if not (all(e in u for e in v)or v ==0):
raise ValidationError('Invalid Value: %s' % value)
是否有更好的方法来转换迭代中的每个值而不是我的for循环?
没有作为答案发布,因为有很多需要改进的地方。等待咆哮我正在做错的事 - 我会很感激...
停止工作eee - 来自validators=[]
答案 0 :(得分:1)
我最终采用了其他方法
class ModelMultipleChoiceWithEmptyField(ModelMultipleChoiceField):
def __init__(self, *args, **kwargs):
super(ModelMultipleChoiceWithEmptyField, self).__init__(*args, **kwargs)
self.choices = list(self.choices) + [('0', 'Brak')]
def clean(self, value):
if self.required and not value:
raise ValidationError(self.error_messages['required'], code='required')
if value == [u'0']:
return value
return super(ModelMultipleChoiceWithEmptyField,self).clean(value)
它更清洁,更有效。免费重用和改进