Сигналы не работает? Я хочу создать экземпляр профиля, когда пользователь был создан - PullRequest
1 голос
/ 12 апреля 2019

Я прочитал часть документа и некоторые статьи, но мой код не работает.

OBS: я использую пользовательский пользователь, созданный с помощью AbstractUser, но я не добавляю дополнительные поля

Посмотрите этот пример

profile.signals.py:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth import get_user_model
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)

Теперь посмотрите в создании пользователя:

>>> from accounts.models import User
>>> me = User.objects.create(username='myusr', email='me@email.com', password='me123456')
>>> me
<User: myusr>
>>> me.save()
>>> me.profile
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/mnt/sda4/Development/coding/Projects/codesv3/env/lib/python3.7/site-packages/django/db/models/fields/related_descriptors.py", line 415, in__get__
    self.related.get_accessor_name()
accounts.models.User.profile.RelatedObjectDoesNotExist: User has no profile.

Я не знаю, что случилось. Кроме того, потому что я не использовал его раньше, и я не знаю о триггерах SQL

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Во-первых, эта команда создает пользователя, и вам не нужно сохранять ее после создания:

me = User.objects.create(username='myusr', email='me@email.com', password='me123456')

Во-вторых, где находятся ваши сигналы? Если вы положите его в модели, все должно работать. Также вы можете разместить, где вы хотите, но вам нужно импортировать его в свои приложения, как здесь:

class ProfileConfig(BaseConfig):
    name = ...
    def ready():
        import profiles.signals # where your signals place
0 голосов
/ 12 апреля 2019

Используйте refresh_from_db() метод , прежде чем получить доступ к profile объекту

>>> from accounts.models import User
>>> me = User.objects.create(username='myusr', email='me@email.com', password='me123456')
>>> me
&ltUser: myusr>
>>> me.save()
>>> <b>me.refresh_from_db() # change is here</b>
>>> me.profile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...