我阅读了文档的一部分和一些文章,但是我的代码无法正常工作。
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触发器
答案 0 :(得分:1)
在您的 signals.py
文件中,创建后保存 profile
,如下所示:
@receiver(post_save, sender=User)
def save_profile(sender, instance, **kwargs):
instance.profile.save()
确保您在相关的 import signals
文件中apps.py
如下示例:
from django.apps import AppConfig
class UsersConfig(AppConfig):
name = 'users'
def ready(self):
import users.signals
然后还要确保您进行了以下更改:
您必须将 app's config
添加到两个文件中的任何一个。
在您的 settings.py
文件的 INSTALLED_APPS
中,如此链接中所述:Django create profile for user signal。
或,
在您相关的 app
的 __init__.py
文件中,如下所示(在此示例中,相关应用是 users
):default_app_config = 'users.apps.UsersConfig'
答案 1 :(得分:0)
在访问profile
对象之前,先使用refresh_from_db()
方法
>>> from accounts.models import User
>>> me = User.objects.create(username='myusr', email='me@email.com', password='me123456')
>>> me
<User: myusr>
>>> me.save()
>>> me.refresh_from_db() # change is here
>>> me.profile
答案 2 :(得分:0)
首先,此命令创建用户,创建后无需保存:
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