Django报错RelatedObjectDoesNotExist: User无关联userprofile问题求助
问题根因排查
- 最核心的原因是你
models.py中所有和自动创建UserProfile相关的信号代码全部被注释了,创建User账号时没有任何逻辑触发关联UserProfile的生成,自然访问request.user.userprofile会抛出不存在的异常 - 历史已注册的账号,在你补上自动生成逻辑之前,也没有对应的UserProfile记录
- 若你的
sign_up注册视图中没有主动创建UserProfile的代码,新注册用户也会缺失关联记录
可行解决步骤
1. 补全自动生成UserProfile的信号逻辑
修改users/models.py,取消注释并补全信号代码:
from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver from django.db import models ''' Our UserProfile model extends the built-in Django User Model ''' class UserProfile(models.Model): updated = models.DateTimeField(auto_now=True) timestamp = models.DateTimeField(auto_now_add=True) user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='userprofile') telephone = models.CharField(max_length=15, null=True, blank=True) address = models.CharField(verbose_name="Address", max_length=100, null=True, blank=True) town = models.CharField(verbose_name="Town/City", max_length=100, null=True, blank=True) county = models.CharField(verbose_name="County", max_length=100, null=True, blank=True) post_code = models.CharField(verbose_name="Post Code", max_length=8, null=True, blank=True) country = models.CharField(verbose_name="Country", max_length=100, null=True, blank=True, default="UK") is_active = models.BooleanField(default=True) agent_id = models.CharField(max_length=100, null=True, blank=True) # 修复原__str__方法的报错问题,原返回self.user是User对象无法直接输出 def __str__(self): return self.user.username # 新增信号处理函数,用户创建后自动生成关联UserProfile @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: UserProfile.objects.create(user=instance)
2. 确保信号被Django正确加载
修改users/apps.py,在UsersConfig类中新增ready方法导入信号:
from django.apps import AppConfig class UsersConfig(AppConfig): name = 'users' def ready(self): # 导入models触发信号注册 import users.models
3. 批量补全历史用户的缺失UserProfile
执行以下命令进入Django shell,批量生成所有已存在用户的关联Profile:
python manage.py shell
在shell中执行代码:
from django.contrib.auth.models import User from users.models import UserProfile for user in User.objects.all(): UserProfile.objects.get_or_create(user=user)
执行完成后退出shell即可。
4. 视图层增加兼容逻辑(可选,避免后续再出现同类报错)
修改account视图,访问Profile前先判断是否存在,不存在则自动创建:
@login_required def account(request): # 自动补全缺失的UserProfile profile, _ = UserProfile.objects.get_or_create(user=request.user) # 用profile代替request.user.userprofile访问属性 braintree_client_token = gateway.client_token.generate({"customer_id": profile.agent_id}) braintree_data = BraintreeData(request.user) # 后续原有逻辑保持不变 context = { "braintree_client_token": braintree_client_token, "invoices": braintree_data.invoices(), } verified = request.GET.get("verified", None) context["verified"] = "true" if verified else "false" return render(request,'users/account.html', context)
内容的提问来源于stack exchange,提问作者numary999
相关产品推荐
相关产品推荐

