Как я могу правильно создавать сигналы в django 3?

#python #python-3.x #django #web #signals

#питон #python-3.x #django #веб #сигналы #python

Вопрос:

У меня есть пользовательское приложение, написанное на django3 (python 3.8). и профиль модели, который расширяет модель пользователя. Поэтому я хочу делать это каждый раз, когда пользователь создает учетную запись, django автоматически создает профиль для этого. У меня есть signals.py файл в пользовательском приложении:

 from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile

@receiver(post_save, sender = User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user = instance)
@receiver(post_save, sender = User)
def save_profile(sender, instance, **kwargs):
    instance.profile.save()
  

и это мой users/apps.py:

 from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'
        
    def ready(self):
        import users.signals
  

Все работает, никаких исключений, ошибок. Но он не создает профили для новых пользователей.
примечание:

  1. я написал print() в ready методе. Но он не печатается.
  2. Когда я создаю профиль на сайте администратора, проблем не возникает. Но почему signals не работает?

Комментарии:

1. как вы создали User экземпляры?

2. Кроме того, save_profile(...) сигнал не имеет значения, он ничего не делает

3. @AzizNadirov ты разобрался в этом?

Ответ №1:

Прежде всего, если вы изменили свою пользовательскую модель или пытаетесь использовать какую-либо другую модель в качестве своей пользовательской модели, не забудьте добавить строку AUTH_USER_MODEL = 'users.User' в свою settings.py (измените ‘users.Пользователь’ к пути вашего пользовательского приложения), чтобы сообщить Django, что вы используете другую модель вместо модели пользователя по умолчанию. Тогда в вашем сигнале вместо того, чтобы from django.contrib.auth.models import User пытаться from django.contrib.auth import get_user_model изменить свои коды на что-то вроде:

 from django.db.models.signals import post_save
from django.contrib.auth import get_user_model
from django.dispatch import receiver
from .models import Profile


User = get_user_model()


@receiver(post_save, sender = User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user = instance)
  

Наконец, если вы уже выполнили эти шаги, и ваши сигналы все еще не работают, попробуйте добавить следующую строку в __init__.py ваше users приложение:

 default_app_config = 'users.apps.UsersConfig'