当前位置: 首页 > 面试题库 >

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

游安康
2023-03-14
问题内容

说我的内容如下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界面之外使用。

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


问题答案:

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

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



 类似资料:
  • 问题内容: 说我的内容如下: 即有多个,每个都有一个和的范围。每个数据库都应有一个从其父数据库中选择的基础,而不是另一个。 创建用于添加的表单时,我想删除选择(因为已经通过页面上的“添加客户端”按钮Rate选择了该选项),并且也将选择限制于此。 我该如何在Django 1.0中做到这一点? 目前,我当前的文件只是样板文件: 而且也是基本的: 在Django 0.96中,我能够通过在渲染模板之前进行

  • 问题内容: 我有以下模型: 我想在管理员中添加时过滤字段,如下所示: 我已经尝试了很多东西,但是没有任何效果!我怎样才能做到这一点? 问题答案: 使用方法:

  • 问题内容: 我有一个模型和,就像这样: 现在我有了一些和对象,我想得到一个查询,该查询选择所有指向少于2的对象。 A就像一个池子,用户(B)加入池。如果仅加入1或0,则根本不应该显示该池。 这样的模型设计可能吗?还是我应该修改一下? 问题答案: 听起来像是一份工作。 如果B计数通常是您需要的过滤或排序标准,或者需要显示在列表视图中,则可以考虑通过将b_count字段添加到A模型并在添加B或添加B时

  • 问题内容: 我有一个模型: 如何编写基于类的视图,该视图创建新的模型实例并将外键设置为? 问题答案: 我通过覆盖方法解决了这个问题。下面是详细说明的样式: 但是我们可以简短地说(感谢dowjones123),在docs中提到了这种情况。

  • 如何仅在Laravel(5.4)中的pivot(中间)表中创建一列,然后对其结果进行过滤? 我有两个模特,电影和剧组。CastAndCrew是为一部电影工作的各种导演、制片人和演员。透视表应定义CastAndCrew成员与电影之间的关系类型。很明显,有人可能在一部电影中扮演演员,在另一部电影中扮演制片人,所以我不能在CastAndCrew表中的条目中定义这一点,因为这只适用于一部电影,对于他们拍摄

  • 问题内容: 我的应用程序中有2个过滤器。根据某些条件,我想选择是否执行第二个过滤器。有没有办法做到这一点? 我做了一些谷歌搜索,但没有成功。我希望请求继续执行而不执行第二个过滤器。那可能吗? 任何帮助将不胜感激。 问题答案: 您可以在请求中设置一个属性,然后在第二个过滤器中对其进行检查。 您可以像这样简化上面的代码: 这样,您只需检查属性“ executeSecondFilter”的存在