在创建用户对象时使用信号功能创建Profile对象

问题描述 投票:1回答:2

我正在阅读有关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()

并且已经在readyapps.py方法中导入了信号:

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

django django-signals
2个回答
1
投票

[UsersConfig.ready()从不运行,因此您的信号不是seen(由Django

解决方案

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

  1. 在设置中添加default_app_config = 'users.apps.UsersConfig'

OR

  1. 只需将信号直接添加到模型中即可。py

0
投票

基于该信息,我想您尚未在应用程序的default_app_config文件中定义__init__.py

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

应为以下内容:

default_app_config = 'users.apps.UsersConfig'

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

© www.soinside.com 2019 - 2024. All rights reserved.