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

问题描述 投票:0回答:2

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

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

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

我该如何解决这个问题?

我的表格

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 django-admin django-autocomplete-light
2个回答
0
投票

我自己也一直在与同样的问题作斗争。

直到我发现从 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'},
            ),
        }

效果很好


-1
投票

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

管理班:

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。

请查看此处的改进版本,该版本可根据需要进行扩展链接

© www.soinside.com 2019 - 2024. All rights reserved.