使用信号函数在创建用户对象时创建配置文件对象

Use signal function to create Profile object upon creation of User object

我正在学习有关 Django 的教程并且有以下 models.py

from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default = 'default.jpg', upload_to = 'profile_pics')

    def __str__(self):
        return f"{self.user.username} Profile"

我使用 register 视图创建一个 User 对象:

def register(request):
    if request.method == 'POST': # if form was submitted w data
        form = UserRegisterForm(request.POST) #instantiate form w post data
        if form.is_valid():
            form.save() #save user to db
            username = form.cleaned_data.get('username') #get this to print out success message
            messages.success(request, f"Your account has been created. You are now able to log in.") #Formatted string literal for f-string
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form':form})

创建 User 对象后,我尝试使用信号创建 Profile 对象。我在我的应用程序目录中创建了一个 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

#Run this function every time a User is created
@receiver(post_save, sender = User)
def create_profile(sender, instance, created, **kwargs):
    if created: #if User was created
        Profile.objects.create(user = instance)

 @receiver(post_save, sender = User)
 def save_profile(sender, instance, **kwargs):
     instance.profile.save()

并在 apps.pyready 方法中导入了信号:

from django.apps import AppConfig


class UsersConfig(AppConfig):
    name = 'users'

    # To make signals work you have to import your signals
    # inside the ready method of our apps.py module
    def ready(self):
        import users.signals

但是,在创建新的 User 后,仍然没有关联的 Profile 对象。知道为什么这不起作用吗?

根据信息,我猜你没有在应用程序的 __init__.py 文件中定义 default_app_config

打开 __init__.py 这将是一个空文件。 在其中,添加一行指定 default_app_config 的值,该值等于您在 apps.py 中定义的 UsersConfig class 的路径。

应该是:

default_app_config = 'users.apps.UsersConfig'

添加这一行,它应该可以工作。

UsersConfig.ready() 永远不会运行 因此你的信号不会被 Django 看到

解决方案

  1. users.apps.UsersConfig 添加到您的 INSTALLED_APPS

  1. 在您的 __init__.py
  2. 中添加 default_app_config = 'users.apps.UsersConfig'

  1. 只需在 models.py
  2. 中直接添加信号

结帐:https://docs.djangoproject.com/en/2.2/ref/applications/