Джанго сигналы от администратора - PullRequest
1 голос
/ 15 марта 2011

Как я могу отличить, например, post_save от обычного просмотра от администратора?

Ответы [ 2 ]

3 голосов
/ 06 октября 2012

Переопределив 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)
2 голосов
/ 15 марта 2011

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

Тем не менее, если вы действительно хотите, вы можете использовать локальный хак, чтобы получить доступ к объекту запроса и выяснить, является ли текущее работающее представление представлением администратора. Чтобы прочитать о том, как выполнить локальный хак, начните с django cookbook , но просто сохраните весь запрос вместо пользователя. Обратите внимание, что многие люди думают, что локальные хаки являются мерзостью. Вот обсуждение . Я думаю, что у них есть очень полезное место, но, не зная больше, я думаю, есть лучшее решение для вас.

...