Python-如何在Django ModelForm中过滤ForeignKey选择?

发布于 2021-02-02 23:17:25

说我的内容如下models.py

class Company(models.Model):
   name = ...

class Rate(models.Model):
   company = models.ForeignKey(Company)
   name = ...

class Client(models.Model):
   name = ...
   company = models.ForeignKey(Company)
   base_rate = models.ForeignKey(Rate)

即有多个Companies,每个都有一个Rates和的范围Clients。每个数据库Client都应有一个Rate从其父数据库中选择的基础,而Company's Rates不是另一个Company's Rates

创建用于添加的表单时Client,我想删除Company选择(因为已经通过Company页面上的“添加客户端”按钮Rate选择了该选项),并且也将选择限制于此Company

我该如何在Django 1.0中做到这一点?

目前,我当前的forms.py文件只是样板文件:

from models import *
from django.forms import ModelForm

class ClientForm(ModelForm):
    class Meta:
        model = Client

而且views.py也是基本的:

from django.shortcuts import render_to_response, get_object_or_404
from models import *
from forms import *

def addclient(request, company_id):
    the_company = get_object_or_404(Company, id=company_id)

    if request.POST:
        form = ClientForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect(the_company.get_clients_url())
    else:
        form = ClientForm()

    return render_to_response('addclient.html', {'form': form, 'the_company':the_company})

在Django 0.96中,我能够通过在渲染模板之前进行如下操作来破解:

manipulator.fields[0].choices = [(r.id,r.name) for r in Rate.objects.filter(company_id=the_company.id)]

ForeignKey.limit_choices_to似乎很有希望,但我不知道该如何传递,the_company.id也不清楚是否可以在Admin界面之外使用。

谢谢。(这似乎是一个非常基本的要求,但是如果我应该重新设计一些内容,我可以提出建议。)

关注者
0
被浏览
77
1 个回答
  • 面试哥
    面试哥 2021-02-02
    为面试而生,有面试问题,就找面试哥。

    ForeignKey由django.forms.ModelChoiceField表示,这是一个ChoiceField,其选择是模型QuerySet。请参见ModelChoiceField的参考。

    因此,为字段的queryset属性提供一个QuerySet 。取决于表单的构建方式。如果构建显式表单,则将具有直接命名的字段。

    form.rate.queryset = Rate.objects.filter(company_id=the_company.id)
    

    如果采用默认的ModelForm对象, form.fields["rate"].queryset = ...

    这是在视图中显式完成的。不得乱动。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看