我在管理面板中使用自定义表单,其中有两个自动完成字段。
我的问题是我不知道如何在更新操作中使用表单以便存储的数据显示自动完成功能。
在我的更新操作实现中,出现的值没有自动完成功能。
我该如何解决这个问题?
我的表格
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 开始,你需要传递到
MyModel._meta.get_field('some_lookup_field').remote_field
AutocompleteSelect
,而不是
MyModel._meta.get_field('some_lookup_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。
请查看此处的改进版本,该版本可根据需要进行扩展链接