python - 如何过滤 Django ModelForm 中的 ForeignKey 选择?

标签 python django django-forms

假设我的 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,每个公司都有一系列 RatesClients。每个 Client 都应该有一个从其父 Company's Rates 而非另一个 Company's Rates 中选择的基本 Rate

在创建用于添加 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,而且我不清楚这是否可以在管理界面之外工作。

谢谢。 (这似乎是一个非常基本的要求,但如果我应该重新设计一些东西,我愿意接受建议。)

最佳答案

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 = ...

这是在 View 中明确完成的。不要乱搞。

关于python - 如何过滤 Django ModelForm 中的 ForeignKey 选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/291945/

相关文章:

django-forms - 你在哪里定义 django 表单?

python - 将 local() 的输出通过管道传输到 Fabric 中远程 run() 命令的标准输入的最佳方法?

python - 如何同时处理keyPressEvent Escape和Ctrl+C(PySide)?

django - 字段可通过 Django shell 使用,但不能通过 Web 应用程序使用

python - 在 django 表单中多次重复单个字段

python - 属性错误 : 'tuple' object has no attribute 'get' in Django

java - Java 还是 Python 更适合在 Google App Engines 上编写网页源代码检查 Web 服务?

python - bool 减法 DeprecationWarning

python - 如何根据模型领域选择形式

django - 在 django form.init 数据中换行