Форум сайта python.su
А ктонибудь знаеть, как правильно перехватить pre_save сигнал для заданного поля?
…или направление манокурения
Офлайн
Можно для объекта заданной модели.
Офлайн
Я вот тоже интуитивно понимаю, что можно, но думал может ктото уже собак поел, и граблей половил, а теперь расскажет мне о результатах, или вообще кинет ссылко на хаутушку ;)
Офлайн
Сори, почемуто прочитал “объекта в заданной модели”, в плане поля.
Можно хотябы какойто пример, чтобы я определился с тем, что мне надо :)
Вообще задача выглядит так:
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”, и пользоваться только им, но это неприятно.
Офлайн
Ну значицца никто не знает, а я уже знаю. Поэтому подытожим, чего я накопал:
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 с использованием админки - ново-добавленная локация не отобразится.
З.Ы. Сам спросил, сам ответил :)
Офлайн
lorienМожно еще в сторону переопределения add() вместо save() покопать, с целью организовать там вызов post_save для данной модели.
Да, c mtm полями и post_save засада. Сам на такую бяку напороля, ещё не было времени её разрулить.
http://softwaremaniacs.org/forum/viewtopic.php?id=977
Офлайн