如何从Django扩展用户模型UserProfile获取登录用户的address字符串值
Django 获取扩展用户表address字段解决方案
问题核心原因
你之前调用values/filter方法返回的是查询集或字典列表,并非单个字符串值,且没有绑定当前登录用户request.user作为查询条件,所以会报错。
正确代码实现
修改你的views.py中test视图逻辑即可:
@login_required(login_url='log') def test(request): # 优先捕获无对应UserProfile的异常,避免运行时报错 try: # 通过OneToOne反向关联直接取值,默认反向关联名为小写的模型类名 address = request.user.userprofile.address except UserProfile.DoesNotExist: # 无对应扩展记录时返回空字符串作为默认值,可按需修改 address = "" context = { 'address': address, } return render(request, "test.html", context)
补充说明
- 如果你在
UserProfile的user字段中自定义了related_name参数,例如:
则取值写法需要对应改为user = models.OneToOneField(User, null=True, on_delete=models.CASCADE, related_name="custom_profile")request.user.custom_profile.address - 如果你已经通过Django信号等逻辑保证每个User都必然对应一条UserProfile记录,可以省略异常捕获,直接写取值逻辑即可
- 另一种等价的显式查询写法:
user_profile = UserProfile.objects.get(user=request.user) address = user_profile.address
内容的提问来源于stack exchange,提问作者Rodrigo Yañez
相关产品推荐
相关产品推荐

