gpt4 book ai didi

python - 验证动态设置的 MultipleChoiceField,该字段最初为空?

转载 作者:行者123 更新时间:2023-11-28 23:04:47 25 4
gpt4 key购买 nike

我有一个包含几种不同形式的 View 。第一个表单有一个搜索字段,它填充了一个多项选择字段,当用户在搜索字段中输入他们的查询时,将发送一个 AJAX 调用以获取与查询匹配的所有记录。然后用户从第一个多项选择字段中选择选项并单击“添加”将它们移动到不同的多选框

这工作正常,但是当表单提交时,我收到一条错误消息“选择有效选项。1 不是可用选项之一。”。在收到表单 init 中的参数后,我尝试设置选项,但这似乎不起作用。

我的表格:

class SiteCoordinatorForm(forms.ModelForm):
selected_studies = forms.MultipleChoiceField(required = False)
site = forms.ChoiceField(required = False)
studies = forms.MultipleChoiceField(required = False)
study_search = forms.CharField(max_length = 50, required = False)

def __init__(self, *args, **kwargs):
super(SiteCoordinatorForm, self).__init__(*args, **kwargs)
if args:
study_list = []
query_dict = args[0]
self.fields['selected_studies'].choices = [(int(x), x) for x in query_dict.getlist('selected_studies')]

self.fields['site'].choices = [(x.pk, "%s (%s)" % (x.primary_name, x.primary_number)) for x in Site.objects.all().order_by('primary_name')]

class Meta:
model = SiteCoordinator
exclude = ('studies', 'site', 'selected_studies')

我填充框的 AJAX 函数:

def search_studies(request):
return_data = {}
studies = []
make_query = lambda terms, fieldname: reduce(lambda x, y: x & Q(**{fieldname + '__icontains': y}), terms, Q())
if 'search_text' in request.POST:
terms = request.POST['search_text'].split()
for rec in Study.objects.filter(make_query(terms, 'name')):
studies.append({
'study': {'id': rec.id, 'name': rec.name, 'number': rec.id}
})

response = {'status': 'success', 'count': len(studies), 'studies': studies}
return HttpResponse(simplejson.dumps(response), mimetype="application/json")

填充 MultiSelectBox 的函数:

function show_results(data, status_code, request){
recs = data.studies;
var select_box = document.getElementById('id_studies');
select_box.options.length = 0;

for (var index = 0; index < recs.length; index ++){
select_box.options[index] = new Option(recs[index].study.name,
recs[index].study.id,
false, false);
}
}

然后 JQuery 移动选项:

$('#add').click(function() {
$('#id_studies option:selected').remove().appendTo('#id_selected_studies');
return false;

});

$('#remove').click(function() {
$('#id_selected_studies option:selected').remove().appendTo('#id_studies');
return false;
});

最佳答案

很明显,我们不想验证 MultipleChoiceField 但确实想要 MultipleSelectWidget 所以解决方案只是将字段更改为

studies = forms.CharField(widget=forms.SelectMultiple)

并在

中做你自己的验证
def clean_studies(self):
...

关于python - 验证动态设置的 MultipleChoiceField,该字段最初为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7192540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com