如何向django ModelMultipleChiceField添加自定义选项?

如何向django ModelMultipleChiceField添加自定义选项?,django,django-forms,multiple-choice,Django,Django Forms,Multiple Choice,我得到了表格: class SearchForm(Form): owner = ModelMultipleChoiceField(queryset=User.objects.all(), required=False) 在定制了相关视图的get_queryset()之后,它可以按预期工作,但是我得到了没有所有者的对象。我想在列表顶部添加额外的新选项(0,“无所有者”),这样我就可以只过滤没有所有者的对象。 如何添加此选项 更新: 我在表单中添加了选项。uuu init_uuu并为其编写了自定义

我得到了表格:

class SearchForm(Form):
owner = ModelMultipleChoiceField(queryset=User.objects.all(), required=False)
在定制了相关视图的
get_queryset()
之后,它可以按预期工作,但是我得到了没有所有者的对象。我想在列表顶部添加额外的新选项
(0,“无所有者”)
,这样我就可以只过滤没有所有者的对象。 如何添加此选项

更新: 我在
表单中添加了选项。uuu init_uuu
并为其编写了自定义清理方法,但如果我选择添加选项,则在使用清理方法之前会出现
验证错误。
我猜我必须重写
表单。u有效吗
但我不确定如何执行,因此我仍然可以使用默认的有效方法

我的代码

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循环更好的方法来转换iterable中的每个值

没有将其作为答案发布,因为还有很多地方需要改进。等待关于我做错了什么的咆哮——我会感激这一切


它停止工作了eee-在validator之前有一些东西来自
validators=[]

我最终使用了另一种方法

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)
它干净多了,而且很有效。可以自由地重复使用和改进

请参见