/admin/accounts/user/1/change/ 'User' 对象的 AttributeError 没有属性 'profile'

Posted

技术标签:

【中文标题】/admin/accounts/user/1/change/ \'User\' 对象的 AttributeError 没有属性 \'profile\'【英文标题】:AttributeError at /admin/accounts/user/1/change/ 'User' object has no attribute 'profile'/admin/accounts/user/1/change/ 'User' 对象的 AttributeError 没有属性 'profile' 【发布时间】:2021-12-07 06:10:52 【问题描述】:

我正在创建一个 API。当我创建新用户或编辑现有用户并保存时,我收到此错误 “/admin/accounts/user/1/change/ 处的 AttributeError “用户”对象没有属性“配置文件”

为了清楚起见,我有一个用户模型和一个配置文件模型,它与我的用户模型具有一对一的关系。

这是我的用户模型

    artist_name = models.CharField(
        max_length=255, 
        default='artist name', 
        unique=True
        )
    slug = models.SlugField(max_length=250, null=True, blank=True)
    email = models.EmailField(max_length=300, unique=True)
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now_add=True)

我的个人资料模型

class Profile(models.Model):
user = models.OneToOneField(
    User, 
    on_delete=models.CASCADE,
     related_name="user", 
     default=1
     )
first_name = models.CharField(max_length=255, blank=True, null=True)
last_name = models.CharField(max_length=255, blank=True, null=True)
country = models.CharField(max_length=500, blank=True, null=True)
gender = models.CharField(max_length = 20, blank=True, null=True)
record_label = models.CharField(max_length=255, blank=True, null=True)
image = models.FileField()

还有我的信号

from .models import User, Profile
from django.dispatch import receiver

@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()

我还应该提到,我还没有我的用户和个人资料的视图。但我认为这不会影响管理区域。 到目前为止,我已经在网上搜索过,但没有任何效果。

谢谢你的期待。

【问题讨论】:

为什么同一个信号有两个信号处理器?您可以将它们合并为一个,将instance.profile.save()移动到第一个处理程序的else 【参考方案1】:

我建议您不要创建单独的用户模型,而是使用默认用户模型。请注意,您在 Profile 模型上需要的一些功能实际上存在于 User 模型中。在用户模型中,默认情况下您有名字、姓氏、电子邮件、用户名、密码 1 和密码 2,但如果您只使用您指定的用户模型,请按照步骤操作。因此,在您的个人资料模型中,您应指定的字段应如下所示:

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

class User(models.Model):
    artist_name = models.CharField(max_length=255, default='artist name', unique=True)
    slug = models.SlugField(max_length=250, null=True, blank=True)
    email = models.EmailField(max_length=300, unique=True)
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)
    last_login = models.DateTimeField(auto_now_add=True)


class Profile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    country = models.CharField(max_length=500, blank=True, null=True)
    gender = models.CharField(max_length = 20, blank=True, null=True)
    record_label = models.CharField(max_length=255, blank=True, null=True)
    image = models.ImageField()


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


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

我希望这会有所帮助,如果它确实投票赞成这个答案并给出回应。

【讨论】:

以上是关于/admin/accounts/user/1/change/ 'User' 对象的 AttributeError 没有属性 'profile'的主要内容,如果未能解决你的问题,请参考以下文章