Переопределив ModelAdmin.response_add, вы можете получить аналогичную функциональность, так как кажется, что администратор django не отправляет никаких сигналов.
Функция response_add вызывается после того, как она успешно проверила и добавила все данные, такие как связанные поля, но также и сам объект.
Таким образом, переопределив метод response_add в нашем собственном классе ModelAdmin, мы можем выполнить код после того, как что-то в админке было успешно добавлено, но не будет выполняться где-то еще.
Я сделал следующее в django 1.4, любые комментарии и отзывы очень ценятся! Кажется, в моем случае это работает хорошо, но я пока не очень знаком со всеми внутренностями в Django, и если это предложенный способ сделать это. Но для меня это звучит лучше, чем локальный хак.
Примечание: Полагаю, вы также можете запускать сигналы самостоятельно, переопределяя ModelAdmin, но не испытывая этого.
Это код, который я использовал для переопределения response_add, который будет выполнять product_get_initial_info (obj.id), только продукт был успешно добавлен в администратор:
class ProductAdmin(admin.ModelAdmin):
prepopulated_fields = {"slug": ("title",)}
inlines = [
ProductInline,
]
def response_add(self, request, obj, post_url_continue='../%s/'):
if obj and obj.id:
tasks.product_get_initial_info(obj.id)
return super(ProductAdmin, self).response_add(request, obj, post_url_continue='../%s/')
Соответствующий исходный код django находится здесь:
Джанго / вно / админ / options.py
class ModelAdmin(BaseModelAdmin):
def add_view(self, request,...)
# .... Many lines of code ...... not putting them here as they're not so relevant
if all_valid(formsets) and form_validated:
self.save_model(request, new_object, form, False)
self.save_related(request, form, formsets, False)
self.log_addition(request, new_object)
# After saving everything response_add gets called with the newly created object
return self.response_add(request, new_object)