0

我有一些问题。我导入 django 用户模型,创建新用户然后尝试获取它的配置文件,我所拥有的只是“配置文件匹配查询不存在”。为什么?我只是创建用户。

这是我的代码:

from django.contrib.auth.models import User 
user = User.objects.create(username="stackoverflow", password="tester1234")
user.get_profile()
4

4 回答 4

2

您可能忘记设置

AUTH_PROFILE_MODULE

在你的settings.py.

于 2012-05-31T08:21:51.120 回答
1

在线文档建议 get_profile()...

返回此用户的特定于站点的配置文件。如果当前站点不允许配置文件,则引发 django.contrib.auth.models.SiteProfileNotAvailable,如果用户没有配置文件,则引发 django.core.exceptions.ObjectDoesNotExist。有关如何定义特定于站点的用户配置文件的信息,请参阅下面有关存储其他用户信息的部分。

您确定已启用配置文件吗?

从您的代码片段看来,您可能没有创建一个单独的类的配置文件(请参见此处.

于 2012-05-31T08:20:35.683 回答
1

还在signals.py中编写save方法:

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

并将其添加到 app.py

class UserProfileConfig(AppConfig):
    name = 'UserProfile'

    def ready(self):
        import UserProfile.signals
于 2020-07-08T10:27:25.370 回答
0

Django 文档清楚地定义了这一点,我错过了,对不起

存储有关用户的附加信息

如果您想存储与您的用户相关的附加信息,Django 提供了一种方法来指定特定于站点的相关模型——称为“用户配置文件”——为此目的。

要使用此功能,请定义一个模型,其中包含您要存储的其他信息或您希望拥有的其他方法的字段,并将模型中的 OneToOneField 命名用户添加到用户模型。这将确保只能为每个用户创建一个模型实例。例如:

from django.contrib.auth.models import User

class UserProfile(models.Model):
    # This field is required.
    user = models.OneToOneField(User)

    # Other fields here
    accepted_eula = models.BooleanField()
    favorite_animal = models.CharField(max_length=20, default="Dragons.")

要指示此模型是给定站点的用户配置文件模型,请使用由以下项目组成的字符串填写设置 AUTH_PROFILE_MODULE,并用点分隔:

定义用户配置文件模型的应用程序的名称(区分大小写)(换句话说,传递给 manage.py startapp 以创建应用程序的名称)。模型(不区分大小写)类的名称。

例如,如果配置文件模型是一个名为 UserProfile 的类并在名为 accounts 的应用程序中定义,则适当的设置将是:

AUTH_PROFILE_MODULE = 'accounts.UserProfile'

当以这种方式定义和指定用户配置文件模型时,每个用户对象将有一个方法——get_profile()——它返回与该用户关联的用户配置文件模型的实例。

如果配置文件不存在,则 get_profile() 方法不会创建配置文件。您需要为 User 模型的 django.db.models.signals.post_save 信号注册一个处理程序,并且在处理程序中,如果 created 为 True,则创建关联的用户配置文件:

在模型.py

从 django.contrib.auth.models 导入用户 从 django.db.models.signals 导入 post_save

# definition of UserProfile from above
# ...

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)
于 2012-05-31T08:34:38.490 回答