2011-08-25 6 views
2

몇 가지 다른 형식의보기가 있습니다. 첫 번째 양식에는 객관식 필드를 채우는 검색 필드가 있으며 사용자가 검색 필드에서 쿼리를 입력하면 쿼리와 일치하는 모든 레코드를 가져 오기 위해 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; 
}); 
+0

지금까지는 모든 선택 항목과 함께 숨겨진 다중 선택 필드를 가짐으로써이를 해결했으며 필터링 된 선택 항목을 해당 다중 선택 항목으로 옮겼습니다. 이것은 현재 약간의 해결 방법이지만, 나는 결국 그것을 알아 내고 싶습니다. – arv23

+0

같은 문제가 있지만 6000 개 이상의 옵션이있을 수 있으므로 숨겨진 다중 선택으로 해결할 수 없습니다. –

답변

4

너무 솔루션

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

에 필드를 변경하고 다음은

def clean_studies(self): 
    ... 
+0

이것은 나를 위해 완벽합니다. 단, 다음과 같은 유니 코드 문자열 목록의 유니 코드 문자열을 반환합니다. u "[u'Canada ', u'Mexico']". 어떻게하면 이것을 피하거나 해킹을하지 않고 파싱 할 수 있습니까? –

+0

@ 존 린만 (JohnLehmann), 몇 달 후 귀하의 의견을 언급하는 새로운 답변을 게시했습니다. – Caumons

0

에 자신의 검증을하는 것입니다 우리가 MultipleChoiceField의 검증을하지 않으려하지만 MultipleSelectWidget을 원하지 않는 것이 분명하다 @AnuragUniyal에서 제안한 솔루션을 사용하고 @ JohnLehmann의 의견에 답하는 예제 :

기본적으로 유니 코드 문자열 목록의 문자열을 다시 eval()을 적용한 파이썬 목록으로 변환합니다.

관련 문제