2011-09-27 99 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投入。如果没有你的帮助,我不会想到这件事。

干杯:-)