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

2024-04-19 16:48:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个链接模型:

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'
“adam”,因为我正在请求页面url:http://127.0.0.1:8000/profile/adam

以下是我的url模式:

urlpatterns = [
    url(r'^edit/', profile_edit, name='profile_edit'),
    url(r'^(?P<username>[\w.@+-]+)$', ProfileView.as_view(), name='profile'),
]  

(以防万一:它们也属于namespaced/profile/)

我正在尝试访问配置文件模型中的模型字段。 为什么我在尝试return obj到我的配置文件时收到错误_详细信息.html模板?你知道吗

我的尝试:
如果我将URL regex改为accept ID或PK而不是<username>,并访问/profile/1的URL,我将收到: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  

然后,错误清除,我可以得到一些东西出现在个人资料_详细信息.html第页。但是,{{object}}引用的是MyUser模型,而不是我所希望的Profile模型。
可能发生了什么?这和

def __str__(self):
    return self.username  

在模型里?你知道吗

编辑:我的配置文件模型的字符串方法:

def __str__(self):
    return self.user  

Tags: 模型selftrueobjgetreturnobjectmodels
1条回答
网友
1楼 · 发布于 2024-04-19 16:48:29

您将username包含在url中,而不是用户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字段,则可以使用user.profileMyUser向后跟踪Profile.user关系到Profile。你知道吗

相关问题 更多 >