首页 > 解决方案 > 如何在 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)

标签: djangodjango-admindjango-autocomplete-light

解决方案


您应该覆盖小部件并将管理站点作为参数提供给它。

管理类:

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。

在这里查看一个改进的版本,如果需要可以扩展链接


推荐阅读