Django admin: get_actions выполняется 3 раза - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть приложение Django 2.2.

Код выглядит следующим образом:

  • модель MyModel, которая зарегистрирована в admin.py с классом MyModelAdmin

  • inline элемент reserve добавлен к модели в виде списка в админке, который содержит кнопку отправки (POST) и выпадающий список выбора, представляющий собой целочисленный диапазон. POST перезагружает экран, т.е. использует форму по умолчанию, никакой специальной формы для этой кнопки нет.

  • перегружен get_actions метод в том же классе администратора, который ничего не делает, просто печатает сообщение что это было выполнено.

  • без специальных перенаправлений, указывающих на некоторое представление в views.py, без специальных шаблонов для визуализации

    class MyModelAdmin(<superclass>):
        list_display = ["field_1", "reserve", ..., "fiend_n"]


        def reserve(self, my_object):
                button = '<button type="submit" name="btn_%s" class="btn">Reserve</button></form>' % my_object.id
                name = 'reserve_%s' % my_object.id
                reserve_select_widget = MyOtherModel(choices=choices, name=name, id=my_object.id)
                reserve_select_widget.prefix = my_object.id
                form_string = reserve_select_widget.as_p() + mark_safe(button)
                return form_string

        def get_actions(self, request):
            actions = super().get_actions(request)
            print("IN get_actions")
            return actions

Все это работает как ожидалось Кроме того, после нажатия кнопки подтверждения get_action выполняется 3 РАЗА (я вижу вывод оператора print 3 раза, и все, что я добавляю к get_actions, также выполняется 3 раза). 3 - это не количество записей в БД для MyModel или MyOtherModel (это такое же поведение «3 раза» для любого количества записей, включая случай пустой таблицы для MyOtherModel). Это не количество записей, отображаемых на экране, это не количество записей, для которых включена кнопка «Отправить», и это не количество параметров в раскрывающемся списке выбора. И, согласно журналу сервера, выполняется только один http-запрос:

[06 / Apr / 2020 14:10:45] "POST / admin / myapp / mymodel /? Item_id = 1 HTTP /1.1 "200 20538

... и нет перенаправлений AFAICT.

Итак, я получил 3 вопроса:

  1. Почему get_actions в MyModelAdmin выполняется 3 раза, когда я отправляю один POST запрос?

  2. Если я хочу сделать что-то значимое в Submit, возможно, есть лучший способ переопределить, чем get_action (я балуюсь get_actions только потому, что это единственное, что выполняется при отправке POST)?

  3. Есть ли способ в Django отследить, какие методы выполняются при отправке в admin?

Спасибо.

...