如何过滤Django2的autocomplete_fields中的选项?

Ore*_*gel 10 python django django-admin django-2.0

在Django 2.0中,添加了autocomplete_fields,这很棒.

如果没有autocomplete_fields,我可以使用formfield_for_foreignkey更改ForeignKeyField的查询集.

但是将两者结合在一起并不起作用 - 看起来自动完成的选项列表是动态的,来自不同的URL,而不是来自当前的表单.

所以问题是 -

如何更改自动完成小部件中的查询集?

小智 9

如果您使用autocomplete_fieldsfor ManyToManyField'self',则此示例将排除当前对象。

通过覆盖获取当前对象的 id get_form

field_for_autocomplete = None

def get_form(self, request, obj=None, **kwargs):
    if obj:
        self.field_for_autocomplete = obj.pk

    return super(MyAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)

接下来,覆盖get_search_results. 仅为模型的自动完成 URI 修改查询集:

def get_search_results(self, request, queryset, search_term):
    queryset, use_distinct = super().get_search_results(request, queryset, search_term)

    # Exclude only for autocomplete
    if request.path == '/admin/myapp/mymodel/autocomplete/':
        queryset = queryset.exclude(field=self.field_for_autocomplete)

    return queryset, use_distinct
Run Code Online (Sandbox Code Playgroud)


Pet*_*per 8

覆盖 ModelAdmin 的get_search_results方法以使用您想要的查询。您可以在为get_queryset用于获取查询集的自动完成字段提供数据的视图方法中看到- 此答案的来源是https://github.com/django/django/blob/03dbdfd9bbbbd0b0172aad648c6bbe3f39541137/django/contrib/管理员/视图/自动完成.py#L42

  • 如果我错了,请纠正我,但是当覆盖 get_search_results 时,模型的每个 ForeignKey 都会受到影响?在我的情况下,我有一个 FK 父级到“自我”,我想阻止选择某个模型作为它自己的父级,并且只允许顶级模型(父级 = 无)作为父级。同时其他模型应该能够将每个条目分配为 FK (2认同)