如何在django管理员更新操作中使用带有自动完成字段的表单



我在管理面板中使用一个自定义表单,其中包含两个自动完成字段。

我的问题是,我不知道如何在更新操作中使用表单,以便使用自动完成功能显示存储的数据

在我的更新操作实现中,出现的值没有自动完成功能。

我该怎么解决?

我的表格

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开始,你需要传递给AutocompleteSelectMyModel._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。

看看这里的改进版本,如果需要的话可以扩展链接

最新更新