簡體   English   中英

如何在 django 3 中正確發出信號?

[英]How can I correctly make signals in django 3?

我在 django3(python 3.8)上編寫了用戶應用程序。 和 model 配置文件,它正在擴展用戶 model。 所以我想每次用戶創建帳戶時都這樣做,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()

這是我的用戶/apps.py:

from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'
        
    def ready(self):
        import users.signals

所有工作,沒有例外,錯誤。 但它不會為新用戶創建配置文件。 筆記:

  1. 我在ready方法中寫了print() 但它不打印。
  2. 當我在管理站點中創建個人資料時,沒有問題。 但是為什么信號不起作用?

First of all if you have changed your User model or trying to use some other model as your user model, don't forget to Add line AUTH_USER_MODEL = 'users.User' to your settings.py (change the 'users.User' to您的用戶應用程序的路徑)告訴 Django 您正在使用另一個 model 而不是默認用戶 model。 然后在您的信號中,而不是from django.contrib.auth.models import User try 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)

最后,如果您已經完成了這些步驟並且您的信號仍然不起作用,請嘗試在您的users應用程序的__init__.py中添加以下行:

default_app_config = 'users.apps.UsersConfig'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM