具有特定字段的自定义查询集的 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)
所有用户都可能在多家工厂工作,因此他们的用户资料都有ManyToManyField
到Factory
。
现在我想为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 Admin 中排序