我有一些问题。 我导入django用户模型,创建新用户然后尝试获取它的配置文件,我所拥有的是“配置文件匹配查询不存在”。为什么?我只是创建用户。
这是我的代码:
from django.contrib.auth.models import User
user = User.objects.create(username="stackoverflow", password="tester1234")
user.get_profile()
答案 0 :(得分:2)
您可能忘记设置
AUTH_PROFILE_MODULE
在settings.py
。
答案 1 :(得分:1)
The online documentation表示get_profile()...
返回此用户的特定于站点的配置文件。如果当前站点不允许配置文件,则引发django.contrib.auth.models.SiteProfileNotAvailable;如果用户没有配置文件,则引发django.core.exceptions.ObjectDoesNotExist。有关如何定义特定于站点的用户配置文件的信息,请参阅下面有关存储其他用户信息的部分。
您确定已启用个人资料吗?
从您的代码段看起来您可能没有创建一个单独的类的配置文件(请参阅here。
答案 2 :(得分:1)
还要在signal.py中写保存方法:
@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
答案 3 :(得分:0)
Django docs清楚地定义了这个,我很想念,抱歉
存储有关用户的其他信息
如果您想存储与您的用户相关的其他信息, 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'
在此中定义并指定用户配置文件模型时 方式,每个User对象都有一个方法 - get_profile() - 其中 返回与之关联的用户配置文件模型的实例 用户。
方法get_profile()如果没有,则不会创建配置文件 存在。您需要为User模型注册一个处理程序 django.db.models.signals.post_save信号和,在处理程序中,如果 created为True,创建关联的用户配置文件:
models.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)