Я бы хотел зарегистрировать обработчик сигнала в модели User, который выглядит примерно так:
def post_save_handler(sender, instance, created, **kwargs):
should_have_profile = instance.has_perm('profile.should_have')
if should_have_profile:
profile, created = Profile.objects.get_or_create(user=instance)
if crated:
profile.save()
else:
old_profile = Profile.objects.filter(user=instance)
if old_profile:
old_profile.delete()
Но в обработчике сигналов тест для has_perm для нового разрешения (который был добавлен или удален в коде представления посредством изменения членства в группе) не проходит корректно. Как будто новые группы еще не были применены.
Я кратко заподозрил _group_perm_cache
и _perm_cache
в contrib.auth.backends.py, но я увеличил свой обработчик сигналов, чтобы удалить эти значения из входящего экземпляра, и результат тот же.
Все, что я могу предположить, - это то, что любые изменения в текущих группах для этого пользователя не передаются. Я также попытался зарегистрировать прослушиватель m2m_changed
на объекте User для этой цели, но он также не вызывался (вероятно, потому что User.groups не реализован как ManyToManyField).
Есть ли способ правильно сделать то, что я хочу?