具有特定字段的自定义查询集的 Django ModelForm 实例

Posted

技术标签:

【中文标题】具有特定字段的自定义查询集的 Django ModelForm 实例【英文标题】:Django ModelForm instance with custom queryset for a specific field 【发布时间】:2010-12-21 17:36:22 【问题描述】:

我有一个与以下不同的模型:

class Bike(models.Model):
    made_at = models.ForeignKey(Factory)
    added_on = models.DateField(auto_add_now=True)

所有用户都可能在多家工厂工作,因此他们的用户资料都有ManyToManyFieldFactory

现在我想为Bike 构造一个ModelForm,但我希望made_at 列表只包含当前用户工作的工厂。这个想法是,用户应该能够添加他们组装的自行车并输入制造自行车的工厂。

我该怎么做?

【问题讨论】:

而且,就其价值而言,您的问题比我指出的问题更具可读性和重点... @celopes:你有这方面的消息来源吗? 不...我什至删除了我说它即将被弃用的评论。出于某种原因,我认为它是。我想我读过一张关于它的票......但是文档在那里有它,并且源代码中没有弃用的迹象。只是不理我。 :-) 它是auto_now_add btw。 这是我读到的票 auto_now_add 将被弃用:code.djangoproject.com/ticket/6434。但忽略它,因为代码中没有任何内容表明它是...... How do I filter ForeignKey choices in a Django ModelForm?的可能重复 【参考方案1】:

在视图中尝试这样的操作

form  = BikeForm()
form.fields["made_at"].queryset = Factory.objects.filter(user__factory)

修改工厂查询集,以便识别用户工作的工厂。

【讨论】:

【参考方案2】:

您的问题可能是dupe of this。

S. Lott的answer有票可以解决你的问题。 他回答:

ForeignKey 由 django.forms.ModelChoiceField 表示,它是一个 ChoiceField,其选择是一个模型 QuerySet。请参阅 ModelChoiceField 的参考。

因此,为字段的查询集属性提供一个查询集。取决于您的表单是如何构建的。如果您构建一个显式表单,您将拥有直接命名的字段。

form.rate.queryset = Rate.objects.filter(company_id=the_company.id) 如果采用默认的 ModelForm 对象,form.fields["rate"].queryset = ...

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

【讨论】:

【参考方案3】:

现在,你应该使用:

    form.base_fields['alumno_item'].queryset = AlumnoItem.objects.prefetch_related(
        'alumno',
        'alumno__estudiante',
        'alumno__estudiante__profile',
        'item'
    )

【讨论】:

我不认为这是正确的。这意味着您在错误的时间(不是从视图中)修改表单。

以上是关于具有特定字段的自定义查询集的 Django ModelForm 实例的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 Django 中查询集的特定字段?

Django更改查询集字段不影响数据库

基于列表显示中的自定义可调用在 Django Admin 中排序

通过存档页面上的自定义字段查询自定义帖子类型

你可以制作一个返回查询集的自定义模板标签吗?如果是,如何? - 姜戈

通过特定的自定义字段订购 WP 查询,不起作用