Пользовательский поиск администратора Django по пользовательскому столбцу - PullRequest
0 голосов
/ 10 октября 2019

Вопрос:
Как добавить возможность поиска элементов в моем настраиваемом столбце Текст справки?

Просмотр FooAdmin FooAdmin Page

Код:
Вот упрощенная версия кода, с которым я работаю:

models.py (да, именно так должны быть настроены модели)


class HelpText(models.Model):

    help_text = models.CharField(max_length=1000)

    def __str__(self):
        return self.help_text

class Foo(models.Model):

    job_name = models.CharField(max_length=200, blank=False, null=False)
    env = models.CharField(max_length=200, blank=False, null=False)

    def __str__(self):
        return self.job_name

class FooHelpText(models.Model):

    foo = models.OneToOneField(Foo, on_delete=models.DO_NOTHING)
    help_text = models.ForeignKey(HelpText, on_delete=models.DO_NOTHING)


    def __str__(self):
        return str(self.help_text)

admin. py


class FooHelpTextInline(admin.TabularInline):

    model = models.FooHelpText

@admin.register(models.Foo)
class FooAdmin(admin.ModelAdmin):

    search_fields = ['env', 'job_name',]

    list_display = ['pk', 'job_name', 'env', '_get_help_text', ]
    inlines = [FooHelpTextInline]


    def _get_help_text(self, obj):
        return obj.foohelptext.help_text

Текущее поведение:
Текущий код выше позволяет мне видеть связанный help_text в столбце на FooAdmin. Однако я ничего не могу найти в этом столбце.

Не тот ответ, который я ищу:
Я знаю, если бы это был обратный путь, когда help_text был ForeignKey на Foo, я мог бы сделать что-то вроде foo__help_text, но это не то, как мои моделинастроены (и не могут измениться).

Желаемое поведение:
Используйте поле поиска для поиска текста справки (не только env и job_name).

Возможное решение (с которым мне нужна помощь):
Я подозреваю, что get_search_results может быть тем, что мне нужно, но я не понимаю, как реализовать его для моего варианта использования.

ОБНОВЛЕНИЕ:
Самое близкое, что я могу получить, - это поиск числа (известного мне определенного ПК) и получение этого результата поиска. Но запрос на самом деле не имеет смысла. И очевидно, что это не желаемая функциональность поиска.

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super().get_search_results(request, queryset, search_term)
        try:
            search_term_as_int = int(search_term)
        except ValueError:
            pass
        else:
            queryset |= models.Foo.objects.select_related(
                'foohelptext').filter(fooshelptext=search_term_as_int)
        return queryset, use_distinct

Я просто не понимаю Python | = (побитовый оператор ИЛИ) и почему он должен быть целым числом.

1 Ответ

0 голосов
/ 10 октября 2019

Намного проще, чем я думал. Нет необходимости в get_search_results. Просто нужно добавить его как foohelptext__help_text__help_text в качестве другого элемента в полях поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...