每当创建一个新的User实例时,我想创建一个链接到它的Profile实例。 为此,我尝试使用信号。
来自models.py的代码:
@receiver(post_save, sender=User)
def create_user_profile(sender,**kwargs):
print(sender)
这是来自view.py:
@api_view(["POST"])
def register(request):
username = request.data.get("username")
first_name = request.data.get("first_name")
last_name = request.data.get("last_name")
email = request.data.get("email")
password1 = request.data.get("password1")
password2 = request.data.get("password2")
user = User.objects.create_user(username,email,password1)
if user:
user = authenticate(username=username, password=password1)
if not user:
return Response({"error": "Login failed"}, status=HTTP_401_UNAUTHORIZED)
token, _ = Token.objects.get_or_create(user=user)
return Response({"token": token.key})
但是,创建新用户时,任何内容都不会打印到我的终端。
编辑:我将该功能移至signals.py并编辑了apps.py,但它仍无效:
from django.apps import AppConfig
class AuthConfig(AppConfig):
name = 'auth'
verbose_name = 'Auth Application'
def ready(self):
from . import signals
以及__init__.py
:
default_app_config = 'auth.apps.AuthConfig'
答案 0 :(得分:0)
也许答案有些过时,但这是您要找的东西吗?
来自Django Docs:
此代码应该放在哪里?
严格来说,信号处理和注册码可以生效 尽管您建议不要在 应用程序的根模块及其模型模块以最小化 导入代码的副作用。
在实践中,信号处理程序通常在信号中定义 它们所涉及的应用程序的子模块。信号接收器是 连接到应用程序配置的ready()方法中 类。如果您使用的是Receiver()装饰器,请导入信号 ready()内部的子模块。
答案 1 :(得分:-1)
通常问题是signals.py
尚未导入you need to add it to your AppConfig
,如评论中所述:
# apps.py
# or whatever the class is called inside the app containing signals.py
class RegistrationConfig(AppConfig):
name = 'registration'
# This is the piece you will need to add
def ready(self):
from . import signals