2011-09-27 98 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形式,用戶可以選擇從下拉菜單中mainContactownerbillTo聯繫人保存到System模型。不過,我想過濾的System形式選擇字段,以便他們都是這樣的:

mainContact Select box: -- only show System_Contacts that have isMainContact = 'Y' 
owner Select Box: -- only show Syste_Contacts that have isOwner = 'Y' 

因爲它是現在,我知道如何通過過濾查詢集來限制一個選擇框,但我不知道如何過濾相關的外鍵查詢集。由於mainContactowner領域外鍵,我需要過濾外部表(System_Contact),不表上的形式建立(System

我知道如何過濾正常的,非外鍵類型選擇框如下:

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__方法並在那裏設置查詢集。

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 

順便說一句,我會建議使用的BooleanField而不是CharField與「Y」和「N」的選擇。

1

這句法看起來是正確的。您是否收到錯誤,或者只是沒有過濾並顯示每個人?嘗試System_Contact.objects.get(id = <some valid id>)以查看它是否只有一個或多個。如果它變得更多,也許它是從一個不同的電話中填充的,而不是那個打算的電話。

1

嗯,這是尷尬...

正如我貼上我的視圖和模型的形式按Alasdair's要求,我發現我的錯誤。這裏是我的(不正確)的觀點:

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)) 

我已經把form.fields["systemOwner"]...部分視圖,而不是觀點的GET部分的POST部分。

這裏是我的修正觀點:

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投入。如果沒有你的幫助,我不會想到這件事。

乾杯:-)