我有一些问题。我导入 django 用户模型,创建新用户然后尝试获取它的配置文件,我所拥有的只是“配置文件匹配查询不存在”。为什么?我只是创建用户。
这是我的代码:
from django.contrib.auth.models import User
user = User.objects.create(username="stackoverflow", password="tester1234")
user.get_profile()
我有一些问题。我导入 django 用户模型,创建新用户然后尝试获取它的配置文件,我所拥有的只是“配置文件匹配查询不存在”。为什么?我只是创建用户。
这是我的代码:
from django.contrib.auth.models import User
user = User.objects.create(username="stackoverflow", password="tester1234")
user.get_profile()
您可能忘记设置
AUTH_PROFILE_MODULE
在你的settings.py
.
还在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
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)