Найти - Пользователи
Полная версия: django сигналы
Начало » Django » django сигналы
1
denz
А ктонибудь знаеть, как правильно перехватить pre_save сигнал для заданного поля?
…или направление манокурения
Александр Кошелев
Можно для объекта заданной модели.
denz
Я вот тоже интуитивно понимаю, что можно, но думал может ктото уже собак поел, и граблей половил, а теперь расскажет мне о результатах, или вообще кинет ссылко на хаутушку ;)
denz
Сори, почемуто прочитал “объекта в заданной модели”, в плане поля.
Можно хотябы какойто пример, чтобы я определился с тем, что мне надо :)
Вообще задача выглядит так:


class Slot(models.Model):
type=models.ForeignKey(SlotType)
serial=models.PositiveIntegerField()
locations=models.ManyToManyField(Location,blank=True,null=True)


class Location(models.Model):
hall=models.ForeignKey(Hall)
date_from=models.DateField()
date_until=models.DateField(blank=True,null=True)


Для локации может быть задана дата начала, а может - дата начала и конца.
Нужно чтобы при добавлении очередной локации система проверяла остальные локации на предмет наличия обоих дат, и при необходимости заполняла недостающую дату конца.
Можно конечно для модели Slot сделать метод типа “add_location”, и пользоваться только им, но это неприятно.
denz
Ну значицца никто не знает, а я уже знаю. Поэтому подытожим, чего я накопал:

http://www.imalm.com/blog/2007/feb/10/using-django-signals-ping-sites-update/
http://www.mercurytide.co.uk/whitepapers/django-signals/

Этого вполне достаточно, чтобы начать использовать события. Единственный ньюанс - в случае с MtM связями. post_save и pre_save не реагируют на add() (что в принципе очевидно).
Результат - в админке при добавлении объекта в MtM поле, post_save отрабатывется ДО того, как поле реально добавлено. И если например, в применении к предыдущему коду в методе post_save выполнить

def slot_post_save(sender, instance, signal, *args, **kwargs):
print instance.locations.all()

то при добавлении Location в Slot.locations с использованием админки - ново-добавленная локация не отобразится.

З.Ы. Сам спросил, сам ответил :)
denz
lorien
Да, c mtm полями и post_save засада. Сам на такую бяку напороля, ещё не было времени её разрулить.
http://softwaremaniacs.org/forum/viewtopic.php?id=977
Можно еще в сторону переопределения add() вместо save() покопать, с целью организовать там вызов post_save для данной модели.
Кстати, а где add() живет? В ManyRelationManager?

Видно придется из джанги франкенштейна делать :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB