Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 10, 2007 16:26:01

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

django сигналы

А ктонибудь знаеть, как правильно перехватить pre_save сигнал для заданного поля?
…или направление манокурения



Офлайн

#2 Сен. 10, 2007 18:12:40

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

django сигналы

Можно для объекта заданной модели.



Офлайн

#3 Сен. 10, 2007 18:17:18

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

django сигналы

Я вот тоже интуитивно понимаю, что можно, но думал может ктото уже собак поел, и граблей половил, а теперь расскажет мне о результатах, или вообще кинет ссылко на хаутушку ;)



Офлайн

#4 Сен. 11, 2007 09:34:34

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

django сигналы

Сори, почемуто прочитал “объекта в заданной модели”, в плане поля.
Можно хотябы какойто пример, чтобы я определился с тем, что мне надо :)
Вообще задача выглядит так:


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”, и пользоваться только им, но это неприятно.



Офлайн

#5 Сен. 14, 2007 13:40:41

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

django сигналы

Ну значицца никто не знает, а я уже знаю. Поэтому подытожим, чего я накопал:

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 с использованием админки - ново-добавленная локация не отобразится.

З.Ы. Сам спросил, сам ответил :)



Офлайн

#6 Сен. 14, 2007 17:37:56

denz
От:
Зарегистрирован: 2007-01-09
Сообщения: 117
Репутация: +  0  -
Профиль   Отправить e-mail  

django сигналы

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

Видно придется из джанги франкенштейна делать :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version