몇 가지 다른 형식의보기가 있습니다. 첫 번째 양식에는 객관식 필드를 채우는 검색 필드가 있으며 사용자가 검색 필드에서 쿼리를 입력하면 쿼리와 일치하는 모든 레코드를 가져 오기 위해 AJAX 호출이 전송됩니다. 그런 다음 사용자는 첫 번째 객관식 필드에서 선택 항목을 선택하고 "추가"를 클릭하여 다른 다중 선택 상자로 이동합니다.필드가 처음 비어있는 동적으로 설정된 MultipleChoiceField에 대한 유효성 검사?
이 방법은 정상적으로 작동하지만 양식을 제출할 때 "선택 유효한 선택 사항 1은 사용 가능한 선택 사항 중 하나가 아닙니다. " init 형식으로 인수를받은 후에 선택을 시도했지만 작동하지 않습니다.
내 양식 : 그런 다음 JQuery와 선택을 이동
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);
}
}
:
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을 채우는 기능 : 상자를 채 웁니다
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 기능 :
$('#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;
});
지금까지는 모든 선택 항목과 함께 숨겨진 다중 선택 필드를 가짐으로써이를 해결했으며 필터링 된 선택 항목을 해당 다중 선택 항목으로 옮겼습니다. 이것은 현재 약간의 해결 방법이지만, 나는 결국 그것을 알아 내고 싶습니다. – arv23
같은 문제가 있지만 6000 개 이상의 옵션이있을 수 있으므로 숨겨진 다중 선택으로 해결할 수 없습니다. –