我有两个相关的模型:
class MyUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=24, unique=True)
profile_page = models.OneToOneField(Profile, null=True)
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)
我正在尝试检索并返回此CBV中单个用户的个人资料的实例:
class ProfileView(DetailView):
queryset = Profile.objects.all()
template_name = 'profile_detail.html'
def get_object(self, *args, **kwargs):
user_profile = self.kwargs.get('username')
obj = get_object_or_404(Profile, user=user_profile)
return obj
get_object_or_404
调用导致以下异常:invalid literal for int() with base 10: 'adam'
"亚当"因为我正在请求页面网址:http://127.0.0.1:8000/profile/adam
以下是我的网址模式:
urlpatterns = [
url(r'^edit/', profile_edit, name='profile_edit'),
url(r'^(?P<username>[\w.@+-]+)$', ProfileView.as_view(), name='profile'),
]
(以防万一:这些也属于namespaced / profile /)
我试图访问个人资料模型中的模型字段。
为什么在尝试return obj
到我的profile_detail.html模板时收到错误?
我尝试了什么:
如果我将网址正则表达式更改为接受ID或PK而不是<username>
并访问/ profile / 1的网址,则会收到:TypeError at /profile/1
__str__ returned non-string (type MyUser)
。如果我然后将我的代码更新为:
def get_object(self, *args, **kwargs):
user_profile = self.kwargs.get('id')
obj = get_object_or_404(Profile, user=user_profile)
objj = obj.user
return objj
然后错误清晰,我可以在profile_detail.html页面上显示一些内容。但是,{{object}}
指的是MyUser模型,而不是我想要的Profile模型
可能会发生什么?是否与
def __str__(self):
return self.username
在模特?
编辑:我的个人资料模型的字符串方法:
def __str__(self):
return self.user
答案 0 :(得分:2)
您在网址中包含username
,而不是用户ID。因此,您需要更改get_object_or_404
行,如下所示:
self.kwargs.get('username')
obj = get_object_or_404(Profile, user__username=user_profile)
正如错误消息__str__ returned non-string (type MyUser)
所示,您的Profile.__str__
方法应该返回一个字符串,例如:
def __str__(self):
return self.user.username
最后,您似乎有两个OneToOneFields
,MyUser.profile_page
和Profile.user
。这是不必要的。如果您删除了MyUser.profile_page
字段,则可以Profile.user
向后MyUser
关注Profile
user.profile
{/ 1}}。{/ p>