Вопрос:

Как отфильтровать выборки в autocomplete_fields в Django2?

python django django-admin django-2.0

1354 просмотра

2 ответа

53 Репутация автора

В Django 2.0 был добавлен autocomplete_fields , и это здорово.

Без autocomplete_fields я могу изменить набор запросов ForeignKeyField, используя formfield_for_foreignkey .

Но объединение этих двух элементов не работает - похоже, список параметров автозаполнения является динамическим и поступает из другого URL-адреса, а не из текущей формы.

Так что вопрос -

Как я могу изменить набор запросов в виджете автозаполнения?

Автор: Oren Shpigel Источник Размещён: 08.01.2018 03:04

Ответы (2)


2 плюса

26973 Репутация автора

Решение

Переопределите метод ModelAdmin, get_search_resultsчтобы использовать нужный запрос. Вы можете увидеть в get_querysetметоде для представления, предоставляющего данные для полей автозаполнения, которые используются для получения набора запросов - источник на этот ответ - https://github.com/django/django/blob/master/django/contrib/ admin / views / autocomplete.py # L42, но я не ожидаю, что эта ссылка со временем станет правильной.

Автор: Peter DeGlopper Размещён: 08.01.2018 03:31

0 плюса

1 Репутация автора

Если вы используете autocomplete_fieldsдля ManyToManyFieldon 'self', этот пример исключит текущий объект.

Получить идентификатор текущего объекта, переопределив 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)

Далее переопределите 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
Автор: Mike Размещён: 20.05.2019 07:06
Вопросы из категории :
32x32