说在我models.py
我有以下几点:如何在Django ModelForm中过滤ForeignKey选项?
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
应该有一个从其父母Company's Rates
中选择的基地Rate
,而不是另一个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界面之外工作。
谢谢。 (这似乎是一个非常基本的请求,但如果我应该重新设计一些我愿意接受的建议。)
好,听起来有希望。我如何访问相关的Field对象? form.company.QuerySet = Rate.objects.filter(company_id = the_company.id)?或通过字典? – Tom 2008-11-15 02:43:15
好的,谢谢扩展例子,但我似乎必须使用form.fields [“rate”]。queryset以避免“'ClientForm'对象没有'rate'属性,我错过了什么? (你的例子应该是form.rate.queryset也是一致的。) – Tom 2008-11-15 03:36:09
非常好,谢谢澄清。为了将来参考,当您通过评论编辑答案时可能值得注意,因为编辑不会显示在我的用户页面的答复选项卡中。 – Tom 2008-11-16 03:53:30