2017-10-28 3 views
1

여러 스레드에서 가능한 모든 솔루션을 시도했지만 여전히 문제를 해결할 수 없습니다. 나는 다음과 같은 코드가 있습니다ModelChoiceField는 "올바른 선택 항목을 선택하십시오"Ajax 호출로 선택 입력하기

models.py를

class CustomerVisit(models.Model): 
    start_date = models.DateField() 
    end_date = models.DateField() 
    customer = models.ForeignKey(Customer) 
    address = models.ForeignKey(Address) 

forms.py

address = forms.ModelChoiceField(label='Address', 
           queryset=Address.objects.none(), 
          widget=forms.Select(attrs={'style': 'width: 100%;'})) 
customer = forms.ModelChoiceField(label='Customer', 
            queryset=Customer.objects.all(), 
          widget=forms.Select(attrs={'style': 'width: 100%;'})) 

views.py

if request.method == "POST": 
    # Cleaning fields 
    post = request.POST.copy() 
    post['address'] = Address.objects.get(id=post['address']) 
    post['start_date'] = dateparser.parse(post['start_date']) 
    post['end_date'] = dateparser.parse(post['end_date']) 
    # Updating request.POST 
    request.POST = post 
    form = CustomerVisitForm(request.POST) 
    if form.is_valid(): 
     form.save(commit=True) 
     return redirect("customervisit:calendar") 

JS

$("#id_customer").select2({}).on("change", function() { 
    var customer_id = $("#id_customer").val(); 
    var id_address = $("#id_address"); 
    id_address.select2({ 
     ajax: { 
      url: '/get_customer_address/' + customer_id, 
      dataType: "json", 
      type: "GET", 
      data: function (params) { 

       var queryParameters = { 
        term: params.term 
       } 
       return queryParameters; 
      }, 
      processResults: function (data) { 
       return { 
        results: $.map(data, function (item) { 
         return { 
          text: item.text, 
          id: item.id 
         } 
        }) 
       }; 
      } 
     } 
    }); 
}); 

address 선택의 존재가 ajax call using select2를 사용 customer 선택에 따라 채워집니다. post['address'] = Address.objects.get(id=post['address'])하지만 난 아직도 내가 사용하고있어 Select a valid choice. That choice is not one of the available choices. 오류

받고 있어요 : 여러 스레드를 읽은 후 나는 형태가 검증되고 전에 내가보기에 다음 코드를 사용하고 있는데 그 이유는 그래서 modelchoicefieldAddress 객체를 기대하는 눈치 queryset=Address.objects.none(), 빈 선택이 필요하기 때문에

+0

이렇게해서는 안됩니다. 모든 논리는 형태로 진행되어야합니다. –

+0

@DanielRoseman 나는 청소 분야에 대해 이야기하고 있다고 생각합니까? 그렇다면 이것을 바꿀 수있는 TODO가 있습니다. 덕분에 –

+0

하지만 요점은 당신이 주소 필드에 대한 그 변환을하고 싶지 않다는 것입니다. 왜 인스턴스가 필요하다고 생각하는지 모르겠지만 폼 필드의 모든 점은 POST 데이터를 가져 와서 적절한 유형으로 변환한다는 것입니다. –

답변

0

문제가 해결되었습니다.

def to_python(self, value): 
    if value in self.empty_values: 
     return None 
    try: 
     key = self.to_field_name or 'pk' 
     value = self.queryset.get(**{key: value}) 
    except (ValueError, TypeError, self.queryset.model.DoesNotExist): 
     raise ValidationError(self.error_messages['invalid_choice'], code='invalid_choice') 
    return value 

그래서 내 queryset queryset=Address.objects 대신 queryset=Address.objects.none() 또는 queryset=Address.objects.all()

감사로 변경하십시오 ModelChoiceField에서 to_python 방법을 확인

미래에 누군가가 나 같은 오류가있는 경우

, 내 일을 저장 Daniel Roseman 님의 의견을 들어주십시오.