Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Showing with 36 additions and 4 deletions.
  1. +3 −2 django/db/models/base.py
  2. +33 −2 tests/modeltests/signals/models.py
View
5 django/db/models/base.py
@@ -209,7 +209,8 @@ def _prepare(cls):
_prepare = classmethod(_prepare)
def save(self, raw=False):
- dispatcher.send(signal=signals.pre_save, sender=self.__class__, instance=self)
+ dispatcher.send(signal=signals.pre_save, sender=self.__class__,
+ instance=self, raw=raw)
non_pks = [f for f in self._meta.fields if not f.primary_key]
cursor = connection.cursor()
@@ -270,7 +271,7 @@ def save(self, raw=False):
# Run any post-save hooks.
dispatcher.send(signal=signals.post_save, sender=self.__class__,
- instance=self, created=(not record_exists))
+ instance=self, created=(not record_exists), raw=raw)
save.alters_data = True
View
35 tests/modeltests/signals/models.py
@@ -13,8 +13,16 @@ def __unicode__(self):
return u"%s %s" % (self.first_name, self.last_name)
+def pre_save_nokwargs_test(sender, instance):
+ print 'pre_save_nokwargs signal'
+
+def post_save_nokwargs_test(sender, instance):
+ print 'post_save_nokwargs signal'
+
def pre_save_test(sender, instance, **kwargs):
print 'pre_save signal,', instance
+ if kwargs.get('raw'):
+ print 'Is raw'
def post_save_test(sender, instance, **kwargs):
print 'post_save signal,', instance
@@ -23,16 +31,20 @@ def post_save_test(sender, instance, **kwargs):
print 'Is created'
else:
print 'Is updated'
+ if kwargs.get('raw'):
+ print 'Is raw'
def pre_delete_test(sender, instance, **kwargs):
print 'pre_delete signal,', instance
- print 'instance.id is not None: %s' % (instance.id != None)
+ print 'instance.id is not None: %s' % (instance.id != None)
def post_delete_test(sender, instance, **kwargs):
print 'post_delete signal,', instance
- print 'instance.id is None: %s' % (instance.id == None)
+ print 'instance.id is None: %s' % (instance.id == None)
__test__ = {'API_TESTS':"""
+>>> dispatcher.connect(pre_save_nokwargs_test, signal=models.signals.pre_save)
+>>> dispatcher.connect(post_save_nokwargs_test, signal=models.signals.post_save)
>>> dispatcher.connect(pre_save_test, signal=models.signals.pre_save)
>>> dispatcher.connect(post_save_test, signal=models.signals.post_save)
>>> dispatcher.connect(pre_delete_test, signal=models.signals.pre_delete)
@@ -40,15 +52,28 @@ def post_delete_test(sender, instance, **kwargs):
>>> p1 = Person(first_name='John', last_name='Smith')
>>> p1.save()
+pre_save_nokwargs signal
pre_save signal, John Smith
+post_save_nokwargs signal
post_save signal, John Smith
Is created
>>> p1.first_name = 'Tom'
>>> p1.save()
+pre_save_nokwargs signal
+pre_save signal, Tom Smith
+post_save_nokwargs signal
+post_save signal, Tom Smith
+Is updated
+
+>>> p1.save(raw=True)
+pre_save_nokwargs signal
pre_save signal, Tom Smith
+Is raw
+post_save_nokwargs signal
post_save signal, Tom Smith
Is updated
+Is raw
>>> p1.delete()
pre_delete signal, Tom Smith
@@ -59,13 +84,17 @@ def post_delete_test(sender, instance, **kwargs):
>>> p2 = Person(first_name='James', last_name='Jones')
>>> p2.id = 99999
>>> p2.save()
+pre_save_nokwargs signal
pre_save signal, James Jones
+post_save_nokwargs signal
post_save signal, James Jones
Is created
>>> p2.id = 99998
>>> p2.save()
+pre_save_nokwargs signal
pre_save signal, James Jones
+post_save_nokwargs signal
post_save signal, James Jones
Is created
@@ -78,6 +107,8 @@ def post_delete_test(sender, instance, **kwargs):
>>> Person.objects.all()
[<Person: James Jones>]
+>>> dispatcher.disconnect(pre_save_nokwargs_test, signal=models.signals.pre_save)
+>>> dispatcher.disconnect(post_save_nokwargs_test, signal=models.signals.post_save)
>>> dispatcher.disconnect(post_delete_test, signal=models.signals.post_delete)
>>> dispatcher.disconnect(pre_delete_test, signal=models.signals.pre_delete)
>>> dispatcher.disconnect(post_save_test, signal=models.signals.post_save)
Please sign in to comment.
Something went wrong with that request. Please try again.