在Django中没有调用保存后信号

时间:2017-09-30 12:35:31

标签: django django-rest-framework django-signals

每当创建一个新的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'

2 个答案:

答案 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