使用 Django Grappelli 管理工具,我可以配置 ForeignKey(多对一)字段以显示为自动完成小部件,而不是下拉字段,如下所示:
class MyModel(models.Model):
related = models.ForeignKey(RelatedModel, related_name='my_models')
class MyModelAdmin(admin.ModelAdmin):
raw_id_fields = ('related',)
autocomplete_lookup_fields = {
'fk': ['related'],
}
但是,我想做的是在另一个(一对多)方向定义自动完成小部件查找(即在RelatedModel的管理员中,以便我可以查找一个或多个 MyModel 对象)。现在,我只是在使用 ModelMultipleChoiceField:
class RelatedModelForm(forms.ModelForm):
class Meta:
model = RelatedModel
fields = ('my_models',)
my_models = forms.ModelMultipleChoiceField(queryset=MyModel.objects.all())
def __init__(self, *args, **kwargs):
super(SaleAdminForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['foods'].initial = self.instance.foods.all()
def save(self, *args, **kwargs):
instance = super(RelatedModelForm, self).save(commit=False)
self.fields['my_models'].initial.update(related=None)
self.cleaned_data['my_models'].update(related=instance)
return instance
class RelatedModelAdmin(admin.ModelAdmin):
model = RelatedModel
form = RelatedModelForm
但是,有太多的 MyModel 实例无法很好地与这种类型的小部件一起使用。理想的做法是只为 MyModel 对象提供一个或多个自动完成查找小部件,以代替 ModelMultipleChoiceField。
Grappelli 有一种简单的方法可以对 FK 关系和 m2m 关系进行自动完成查找,但是有没有一种方法可以实现一对多关系?似乎这些的自动完成与其他两种类型的关系一样有用,所以我猜Grappelli也会在那里提供一种简单的方法,但我没有找到它......