【发布时间】:2010-09-22 11:02:07
【问题描述】:
假设我的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 都应该有一个从其父Company's Rates 中选择的基Rate,而不是另一个Company's Rates。
创建用于添加Client 的表单时,我想删除Company 选项(因为已经通过Company 页面上的“添加客户端”按钮选择了该选项)并限制@987654336 @ 也可以选择 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,而且我不清楚这是否可以在管理界面之外工作。
谢谢。 (这似乎是一个非常基本的要求,但如果我应该重新设计一些东西,我愿意接受建议。)
【问题讨论】:
-
感谢您对“limit_choices_to”的提示。它不能解决您的问题,但我的问题:-) 文档:docs.djangoproject.com/en/dev/ref/models/fields/…
-
如今,如果您使用的是通用编辑视图(CreateView 等),那么我在 ModelForm 上过滤 ForeignKey 选择的首选方法是在视图中覆盖 get_form_class()。然后您可以设置 base_fields['my_field_name'].limit_choices_to - 例如见stackoverflow.com/questions/70399761
标签: python django django-forms