如何从基于类的详细信息视图中检索并返回实例?

时间:2017-07-07 09:57:14

标签: python django django-models django-views

我有两个相关的模型:

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  

1 个答案:

答案 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

最后,您似乎有两个OneToOneFieldsMyUser.profile_pageProfile.user。这是不必要的。如果您删除了MyUser.profile_page字段,则可以Profile.user向后MyUser关注Profile user.profile {/ 1}}。{/ p>