Я пытаюсь динамически создать список действий администратора, используя метод get_actions()
для ModelAdmin
. Каждое действие относится к конкретному экземпляру другой модели, и, поскольку новые экземпляры могут быть добавлены или удалены, я хочу убедиться, что список действий отражает это.
Вот это ModelAdmin
:
class PackageAdmin(admin.ModelAdmin):
list_display = ('name', 'quality')
def _actions(self, request):
for q in models.Quality.objects.all():
action = lambda modeladmin, req, qset: qset.update(quality=q)
name = "mark_%s" % (q,)
yield (name, (action, name, "Mark selected as %s quality" % (q,)))
def get_actions(self, request):
return dict(action for action in self._actions(request))
(Странное повторяющееся указание возвращаемого значения кортежей объясняется документами Django для get_actions()
.)
Как и следовало ожидать, это приводит к списку действий администратора с соответствующим названием для массового назначения Quality
внешних ключей для Package
объектов.
Проблема в том, что какое бы действие я ни выбрал, один и тот же объект Quality
назначается выбранным Package
s.
Я предполагаю, что все замыкания, которые я создаю с ключевым словом lambda
, содержат ссылку на один и тот же объект q
, поэтому каждая итерация меняет значение q
для каждой функции .
Могу ли я разорвать эту ссылку, позволяя мне по-прежнему использовать список замыканий, содержащих различные значения q
?
Редактировать: я понимаю, что lambda
не является необходимым в этом примере. Вместо:
action = lambda modeladmin, req, qset: qset.update(quality=q)
Я мог бы просто использовать def
:
def action(modeladmin, req, qset):
return qset.update(quality=q)