【问题标题】:Django - Limit select field to queryset of foreign table?Django - 将选择字段限制为外部表的查询集?
【发布时间】:2011-11-26 05:58:05
【问题描述】:

我有两个模型如下:

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 表单时,用户可以从下拉菜单中选择mainContact ownerbillTo 联系人以保存到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')

谢谢

【问题讨论】:

    标签: django filtering django-queryset


    【解决方案1】:

    这是我目前正在尝试的,但没有成功:

    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”。

    【讨论】:

      【解决方案2】:

      该语法看起来是正确的。您是收到错误消息还是只是没有过滤并显示给所有人?试试 System_Contact.objects.get(id=<some valid id>) 看看它是否只有一个或多个。如果它得到更多,则可能是从与预期不同的调用中填充的。

      【讨论】:

        【解决方案3】:

        这很尴尬……

        当我按照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"]... 部分放在视图的POST 部分,而不是视图的GET 部分。

        这是我的修正观点:

        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 输入。如果没有你的帮助,我不会想到看那个。

        干杯:-)

        【讨论】:

          猜你喜欢
          • 2011-07-13
          • 1970-01-01
          • 2011-11-14
          • 1970-01-01
          • 2018-06-02
          • 1970-01-01
          • 2012-08-12
          • 2016-08-01
          • 2015-11-08
          相关资源
          最近更新 更多