#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
Все работает, никаких исключений, ошибок. Но он не создает профили для новых пользователей.
примечание:
- я написал
print()
вready
методе. Но он не печатается. - Когда я создаю профиль на сайте администратора, проблем не возникает. Но почему 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'