使用信号功能在创建用户对象时创建配置文件对象



我是关于 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对象。知道为什么这不起作用吗?

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

解决 方案

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

  1. __init__.py中添加default_app_config = 'users.apps.UsersConfig'

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

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

根据这些信息,我猜您尚未在应用程序的__init__.py文件中定义default_app_config

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

它应该如下:

default_app_config = 'users.apps.UsersConfig'

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

最新更新