我在管理面板中使用一个自定义表单,其中包含两个自动完成字段。
我的问题是,我不知道如何在更新操作中使用表单,以便使用自动完成功能显示存储的数据
在我的更新操作实现中,出现的值没有自动完成功能。
我该怎么解决?
我的表格
class ModelSeoMetadatumForm(forms.ModelForm):
name = ModelChoiceField(
required=False,
queryset=MetaTag.objects.exclude(name__isnull=True).values_list('name', flat=True).distinct(),
widget=autocomplete.ModelSelect2(url='seo:name-autocomplete')
)
property = ModelChoiceField(
required=False,
queryset=MetaTag.objects.exclude(property__isnull=True).values_list('property', flat=True).distinct(),
widget=autocomplete.ModelSelect2(url='seo:property-autocomplete')
)
class Meta:
model = ModelSeoMetadatum
fields = ('name', 'content', 'property', 'content_type', 'object_id')
我的管理员
@admin.register(ModelSeoMetadatum)
class ModelSeoMetadatumAdmin(admin.ModelAdmin):
add_form = ModelSeoMetadatumForm
list_display = ('id', 'name', 'content', 'property', 'content_object')
fields = ('name', 'content', 'property', 'content_type', 'object_id')
def get_form(self, request, obj=None, **kwargs):
defaults = {}
if obj is None:
defaults['form'] = self.add_form
defaults.update(kwargs)
return super().get_form(request, obj, **defaults)
我自己已经为同样的问题斗争了很长一段时间。
直到我发现从Django 3.2开始,你需要传递给AutocompleteSelect
MyModel._meta.get_field('some_lookup_field')
,而不是MyModel._meta.get_field('some_lookup_field').remote_field
,它才起作用
所以没有.remote_field
所以对我来说:
class MyForm(forms.ModelForm):
class Meta:
widgets = {
'some_lookup_field': AutocompleteSelect(
MyModel._meta.get_field('some_lookup_field'),
admin.site,
attrs={'style': 'width: 20em'},
),
}
运行良好
您应该覆盖小部件并将管理站点作为参数。
管理类:
class MyAdmin(admin.ModelAdmin):
form = MyForm
表单定义:
class MyForm(forms.ModelForm):
class Meta:
widgets = {
'some_lookup_field': AutocompleteSelect(
MyModel._meta.get_field('some_lookup_field').remote_field,
admin.site,
attrs={'style': 'width: 20em'},
),
}
注意,您需要在查找字段的管理员定义中至少有一个search_filter。
看看这里的改进版本,如果需要的话可以扩展链接