我有两个模型 models.py
class Inner(models.Manager):
name = models.CharField(max_length=256)
class Outer(models.Manager):
name = models.CharField(max_length=256)
inner = models.ForeignKey(Data)
然后我有一个ModelForm
Outer
.
class OuterModelForm(ModelForm):
class Meta:
model = Outer
fields = ['name', 'inner']
我的问题是,在生成的表单的下拉列表中显示可能的内在值时,ModelForm 会调用什么。
我已通过用自定义models.Manager
覆盖objects
来排除以下内容。(只需在其中添加打印并查看所谓的内容(
-
values
-
get
-
get_queryset
-
all
-
filter
这是表单字段的责任,它将调用其queryset
属性。默认情况下,这只是相关类的默认管理器;在您的情况下,Data.objects.all()
.
若要更改此设置,请使用显式查询集重新定义字段:
class OuterModelForm(ModelForm):
inner = forms.ModelChoiceField(queryset=Data.objects.filter(myparam='whatever'))
或者,如果需要它依赖于某个其他参数,请在 __init__
方法中显式设置该属性:
class OuterModelForm(ModelForm):
def __init__(self, *args, **kwargs):
param = kwargs.pop('myparam', None)
super(OuterModelForm, self).__init__(*args, **kwargs)
self.fields['inner'].queryset = Data.objects.filter(myparam=param)