Skip to content

Instantly share code, notes, and snippets.

@matheuscas
Forked from Diegow3b/views.py
Last active August 7, 2020 14:52
Show Gist options
  • Save matheuscas/80779cbb357f933025ffb1d84c278c75 to your computer and use it in GitHub Desktop.
Save matheuscas/80779cbb357f933025ffb1d84c278c75 to your computer and use it in GitHub Desktop.
Turning arround m2m_changed bug in admin from Django 1.8
'''
Obs1: m2m_changed never trigger the remove signal (pre_remove, post_remove) when deleted, so this ways you can force he do it
obs2: Since the pre_clear data will be removed anyways to new valuei n post_add add it again and when you fully remove data
the add events wont be trigger, so this solution will simule the exacly action the m2m_changed should do
'''
class OtherModel(model.Models)
pass
class MyModel(model.Models):
m2m_attribute = models.ManyToManyField(OtherModel,related_name='other_model', blank=True)
# SIGNALS
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
@receiver(m2m_changed, sender=MyModel.servicos.through)
def othermodel_servicos_changed(sender, **kwargs):
action = kwargs.pop('action', None)
pk_set = kwargs.pop('pk_set', None)
instance = kwargs.pop('instance', None)
if action == "pre_clear":
#Here we do the trick
instance_m2m_attributes = instance.m2m_attribute.all()
if instance_m2m_attributes:
for one_m2m in instance_m2m_attributes:
instance.m2m_attribute.remove(one_m2m)
instance.save()
else:
instance.is_active = False
instance.save()
if action == "post_add" and pk_set:
#Do Your Stuff
@PeterCat12
Copy link

👍

@rainyman2012
Copy link

"MyModel.servicos.through" should be "MyModel.m2m_attribute .through"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment