注册用户后,Django Signals 设置信号以在 UserExtended 模型上创建默认头像图像

问题描述

在 Django 用户模型上注册用户后,我想在 UserExtended 模型上创建一个条目。

这是 UserExtended 模型:

class UserExtended(models.Model):
    extended_id = models.AutoField(primary_key=True,editable=False)
    avatar = models.ImageField(null=True,blank=True,default='Capture.PNG')
    user = models.OnetoOneField(User,on_delete=models.CASCADE,null=False)
    created_at = models.DateTimeField(auto_Now_add=True)
    updated_at = models.DateTimeField(auto_Now=True)

这里是注册用户的视图函数

@api_view(['POST'])
def register_user(request):
    data = request.data
    user = User.objects.create(
        first_name=data['name'],username=data['username'],email=data['email'],password=make_password(data['password'])
    )

    serializer = UserSerializerWithToken(user,many=False)
    return Response(serializer.data)

这是序列化器

class UserSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField(read_only=True)
    isAdmin = serializers.SerializerMethodField(read_only=True)
    avatar = serializers.SerializerMethodField()

    def get_avatar(self,obj):
        avatar = obj.userextended.avatar.url
        print(avatar)
        if avatar == '':
            avatar = 'null'
        return avatar

    class Meta:
        model = User
        fields = ['id','username','email','name','avatar','isAdmin']

    def get_name(self,obj):
        name = obj.first_name
        if name == '':
            name = obj.email
        return name

    def get_isAdmin(self,obj):
        return obj.is_staff


class UserSerializerWithToken(UserSerializer):
    token = serializers.SerializerMethodField(read_only=True)

    class Meta:
        model = User
        fields = ['id','isAdmin','token']

这是signal.py:

from django.db.models.signals import post_save,pre_delete
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import UserExtended


@receiver(post_save,sender=User)
def create_user_extended(sender,instance,created,**kwargs):
    if created:
        UserExtended.objects.create(user=instance)


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

但信号无法为新注册用户创建默认头像文件

我是新来的。请帮帮我。

解决方法

Django 默认不查找任何名为 signal.py 等的文件。因此,您的信号从未注册(实际上您写入它们的文件从未运行)会发生什么。添加信号的一般解决方案是将它们写入单独的文件中,然后在应用配置的 ready 方法中导入/注册它们。

在您编写 signal.py 的应用程序中,应该有一个文件 apps.py,其中应该有一个继承自 AppConfig 的类,编辑这个类并添加一个 ready方法并在那里导入您的信号:

from django.apps import AppConfig


# The parts marked as "Don't edit" mean to keep them as it already is in _your_ code and not copy it
class YourAppConfig(AppConfig): # Don't edit
    default_auto_field = 'django.db.models.BigAutoField'  # Don't edit
    name = 'your_app'  # Don't edit
    
    # Copy only the code below
    def ready(self):
        # models,signals etc. are imported only here because otherwise the models might not be loaded yet
        from . import signal