在 Django 的 inlineformset_factory 中选择外键元素的子集

发布于 2024-10-09 04:07:51 字数 744 浏览 4 评论 0原文

我有一个带有两个外键的模型:

class Model1(models.Model):
  model_a = models.ForeignKey(ModelA)
  model_b = models.ForeignKey(ModelB)
  value = models.IntegerField()

然后,我创建一个内联表单集类,如下所示:

an_inline_formset = inlineformset_factory(ModelA, Model1, fk_name="model_a")

然后实例化它,如下所示:

a_formset = an_inline_formset(request.POST, instance=model_A_object)

一旦此表单集在模板/页面中呈现,就会有与 model_b 字段关联的 ChoiceField。我遇到的问题是生成的下拉菜单中的元素包含 ModelB 表中找到的所有元素。我需要根据 ModelB 中的某些标准选择其中的一个子集。同时,在实例化 inlineformset_factory 时,我需要保留对 model_A_object 实例的引用,因此,我不能只使用 这个示例。有什么建议吗?

I have a model with two foreign keys:

class Model1(models.Model):
  model_a = models.ForeignKey(ModelA)
  model_b = models.ForeignKey(ModelB)
  value = models.IntegerField()

Then, I create an inline formset class, like so:

an_inline_formset = inlineformset_factory(ModelA, Model1, fk_name="model_a")

and then instantiate it, like so:

a_formset = an_inline_formset(request.POST, instance=model_A_object)

Once this formset gets rendered in a template/page, there is ChoiceField associated with the model_b field. The problem I'm having is that the elements in the resulting drop down menu include all of the elements found in ModelB table. I need to select a subset of those based on some criteria from ModelB. At the same time, I need to keep the reference to the instance of model_A_object when instantiating inlineformset_factory and, therefore, I can't just use this example. Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

草莓味的萝莉 2024-10-16 04:07:51

您需要做的是 更改 ModelChoiceField 的查询集

最简单的方法可能是对表单集的表单进行猴子修补。您应该能够在构建表单集后立即执行此操作:

an_inline_formset.form.base_fields['model_b'].queryset = ModelB.objects.filter(whatever=True)

不是最漂亮的,但它应该可以工作。

What you need to do is change the ModelChoiceField's queryset

The easiest way to do this may be to monkey-patch the formset's form. You should be able to do this right after constructing the formset with:

an_inline_formset.form.base_fields['model_b'].queryset = ModelB.objects.filter(whatever=True)

Not the prettiest, but it should work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文