Django访问/profile时报AttributeError:'User'对象无userprofile属性求助
问题解决方法
你的错误来自两个可快速修正的配置问题:
1. 关联名称不匹配
你在UserProfile模型的OneToOneField中指定了related_name='profile',这个参数决定了你从User侧反向查询关联UserProfile时的属性名,和UserProfile的类名没有关系。
所以你需要把两处调用user.userprofile的代码全部改为user.profile:
- 第一处在
views.py的profile_view函数:将up = user.userprofile修改为up = user.profile - 第二处在
views.py的SignUpView类的form_valid方法:将up = obj.userprofile修改为up = obj.profile
2. 旧用户数据兼容问题
如果修改完关联名称后仍然报错,是因为你在添加UserProfile模型之前注册的测试用户没有生成对应的关联UserProfile记录。你可以删除现有测试用户重新注册验证,也可以添加信号逻辑实现新用户注册自动生成关联资料:
可选:添加信号自动创建用户资料
在users应用目录下新建signals.py,添加如下代码:
from django.db.models.signals import post_save from django.contrib.auth.models import User from django.dispatch import receiver from .models import UserProfile @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: UserProfile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): instance.profile.save()
然后在users应用的apps.py里的UsersConfig类中添加ready方法导入信号:
from django.apps import AppConfig class UsersConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'users' def ready(self): import users.signals
配置完成后所有新注册的用户都会自动生成关联的UserProfile记录,不会再出现找不到属性的问题。
内容的提问来源于stack exchange,提问作者Alusine Barrie
相关产品推荐
相关产品推荐

