2011-09-27 2 views
2

Django - 선택 테이블을 외국 테이블의 쿼리 세트로 제한 하시겠습니까?

다음과 같은 두 가지 모델이 있습니다.

System_Contact 
    first_name 
    last_name 
    isOwner = CharField ('Y'/'N') 
    isMainContact = CharField ('Y'/'N') 

System 
    mainContact = ForeignKey(System_Contact) 
    owner = ForeignKey(System_Contact) 
    billTo = ForeignKey(System_Contact) 

따라서 웹 페이지에서 System 양식을 표시 할 때 사용자는 System 모델에 저장하기 위해 드롭 다운 메뉴에서 mainContactownerbillTo 연락처를 선택할 수 있습니다. 그러나 System 형식의 선택 필드를 필터링하여 다음과 같이되도록하고 싶습니다.

이제는 쿼리 상자를 필터링하여 선택 상자를 제한하는 방법을 알고 있지만 그렇지 않습니다. 관련 외래 키 querySet을 필터링하는 방법을 알고 있어야합니다. mainContactowner 필드는 외래 키이므로 외부 테이블 (System_Contact)을 필터링해야합니다. 양식이 작성된 테이블 (System)이 아닙니다.

정상 외래 키 유형을 필터링하는 방법을 알고 있습니다. select 상자를 다음과 같이 :

form.fields["some_field"].queryset = Some_Model.objects.filter(some_field="Foo") 

어떻게 내가 외부 테이블을 필터링 할 수 있도록이 '확장 할 것이라고?

이것은 현재 시도하고있는 것입니다.

form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y') 

고맙습니다.

답변

2

이 내가 성공하지 않고, 현재 시도하고있는 무슨이다 :

form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y') 

당신이 모델 양식을 포함 볼 수 있습니까? 그것은 나에게 괜찮아 보인다.

다른 접근법은 모델 양식의 __init__ 메소드를 대체하고 거기에서 queryset을 설정하는 것입니다. 여담으로

class SystemForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(SystemForm, self).__init__(*args, **kwargs) 
     self.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y') 
    class Meta: 
     model = System 

, 나는 'Y'와 'N'선택 등으로 BooleanField 대신 CharField (A)의 사용을 권장합니다. 내가보기 및 모델 형태로 붙여 넣기가 Alasdair's 요청에 따라이었다뿐만 아니라이 당황

1

. 오류가 발생 했습니까 아니면 모든 사람을 필터링하고 표시하지 않는 것입니까? System_Contact.objects.get (id = <some valid id>)을 사용하여 하나 이상의 정보 만 가져 오는지 확인하십시오. 그것이 더 많은 것을 얻는 경우에, 아마 그것은 예정 한 것보다는 다른 외침에서 사람을 거주 케하고있다.

1

...

, 내 오류를 발견했습니다. 내가 뷰가 아닌 뷰의 GET 섹션의 POST 섹션에서 form.fields["systemOwner"]... 부분을 넣어했다

def system_contacts(request, systemID): 
    sys = System.objects.get(pk=systemID) 
    if request.method == 'POST': 
     form = System_Contacts_Form(request.POST, instance=sys) 
     form.fields["systemOwner"].queryset = System_Contact.objects.filter(systemOwner__exact='Y') 
     form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact__exact = 'Y') 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/systems/') 
    else: 
     conts = Contact_List.objects.filter(systemID = sys.pk) 
     form = System_Contacts_Form(instance=sys) 
    return render_to_response('pages/systems/system_pages/contacts.html', {'sys':sys, 'form':form, 'conts':conts}, context_instance=RequestContext(request)) 

: 여기 내 (잘못된)이다.

여기 내 수정이다 :

def system_contacts(request, systemID): 
    sys = System.objects.get(pk=systemID) 
    if request.method == 'POST': 
     form = System_Contacts_Form(request.POST, instance=sys) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/systems/') 
    else: 
     conts = Contact_List.objects.filter(systemID = sys.pk) 
     form = System_Contacts_Form(instance=sys) 
     form.fields["systemOwner"].queryset = System_Contact.objects.filter(systemOwner__exact='Y') 
     form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact__exact = 'Y') 
    return render_to_response('pages/systems/system_pages/contacts.html', {'sys':sys, 'form':form, 'conts':conts}, context_instance=RequestContext(request)) 

이제 내 수정보기 작품과 필터링 양식에 select 입력에서 작동합니다. 나는 당신의 도움없이 그것을 보지 않을 것입니다.

건배 :-)

관련 문제