Django: добавление пользователя в группы в сигнале - PullRequest
0 голосов
/ 29 мая 2019

Я создал сигнал, который должен делать 3 вещи:

  1. Создать пользователя
  2. Создать профиль указанного пользователя
  3. Добавить пользователя в группу

Используя сигнал, шаги 1 и 2 работают нормально, но я не могу добавить пользователя в группу (шаг 3).

# Signals
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
  if created:
    Profile.objects.create(user=instance)
    group = Group.objects.get(name='generics')
    instance.groups.add(group)

Сделал некоторую отладку и обнаружил, что даже если я закомментирую Profile.objects.create(user=instance), я все равно не могу добавить какие-либо группы в instance.

Я что-то здесь упускаю? Я не получаю никаких ошибок.

Редактировать 1: Это пользовательская модель пользователя.

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
  first_name = None
  last_name = None

  class Meta:
    verbose_name_plural = 'users'

  def __str__(self):
    return self.username

Я просто переместил first_name и last_name в таблицу Profile. Больше ничего не делал, как видите. Пользователи и профили успешно создаются, поэтому эта пользовательская модель отлично работает.

Хотя это и не нужно, я добавил instance.save() после добавления группы, но он все равно не будет работать. Администратор показывает, что группы не были добавлены, а таблица БД core_user_groups все еще пуста.

Редактировать 2: Добавить тест консоли

Еще более странно, я попытался добавить группу, используя ./manage.py shell, и она отлично работает.

>>> from core.models import User
>>> from django.contrib.auth.models import Group
>>> group = Group.objects.get(pk=1)
>>> group
<Group: generics>
>>> user = User.objects.get(pk=23)
>>> user
<User: sonic>
>>> user.groups.add(group)

# At this point I check the admin and the db and it worked. Hmmm....but how to do it within a signal...

1 Ответ

0 голосов

Если вы хотите просто добавить некоторые поля в модель пользователя по умолчанию, вам не следует наследовать от абстрактного пользователя. Лучше использовать связанные модели, используя однозначное поле

Мое предложение - удалить пользовательский класс. И добавьте связь между вашим профилем и моделями auth.User.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...