Django应用程序:UserPasseTestMixin在允许访问查看之前验证用户是否是帖子的作者?

Django应用程序:UserPasseTestMixin在允许访问查看之前验证用户是否是帖子的作者?,django,Django,我的应用程序的目标是允许用户为自己的私人帐户查看创建帖子 我使用基于类的视图来显示当前登录用户的帖子。为了防止用户看到其他用户的帖子,我有一个userpassestimxin test_func,它迭代查询集并检查以确保他们是这些帖子的作者 我遇到的问题是,当没有帖子可显示时,我会收到一个404错误代码,说明没有与查询匹配的内容。我希望它仍然显示页面,即使没有帖子可用。当我只使用get_queryset函数时,它可以工作并显示我的模板而不显示帖子,但是没有UserPasseStMixin和tes

我的应用程序的目标是允许用户为自己的私人帐户查看创建帖子

我使用基于类的视图来显示当前登录用户的帖子。为了防止用户看到其他用户的帖子,我有一个userpassestimxin test_func,它迭代查询集并检查以确保他们是这些帖子的作者

我遇到的问题是,当没有帖子可显示时,我会收到一个404错误代码,说明没有与查询匹配的内容。我希望它仍然显示页面,即使没有帖子可用。当我只使用get_queryset函数时,它可以工作并显示我的模板而不显示帖子,但是没有UserPasseStMixin和test_func,用户可以在URL中输入另一个人的用户名,并可以查看另一个人的帐户/帖子

以下是my views.py文件中此基于类的视图的代码:

class UserSessionListView(LoginRequiredMixin, UserPassesTestMixin, ListView):
    model = session
    template_name = 'programmerjournal/user_sessions.html'
    context_object_name = 'sessions'
    paginate_by = 24

    def get_queryset(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        return session.objects.filter(author=user).order_by('-date_added')

    def test_func(self):
        user = get_object_or_404(User, username=self.kwargs.get('username'))
        posts = get_list_or_404(session, author=user)
        for post in posts:
            if self.request.user == post.author:
               return True
            return False
当我只使用
get_queryset
功能时,它可以工作并显示我的模板,而不显示帖子,但是没有
userpassestimixin
test_func
,用户可以在URL中输入另一个人的用户名,并能够查看另一个人的帐户/帖子

事实上,即使使用
userpassestimixin
,在这种情况下,一个人也可以输入另一个帐户并获得访问权限,因为您使用的是
username
,而根本不考虑登录的用户

如果不想显示其他用户的帖子,则不应使用
URL参数。但请使用包含登录用户的
请求。用户

class UserSessionListView(LoginRequiredMixin, ListView):
    model = session
    template_name = 'programmerjournal/user_sessions.html'
    context_object_name = 'sessions'
    paginate_by = 24

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            author=self.request.user
        ).order_by('-date_added')
class UserSessionListView(LoginRequiredMixin,ListView):
模型=会话
模板名称='programmerjournal/user\u sessions.html'
上下文\对象\名称='会话'
分页单位=24
def get_queryset(self、*args、**kwargs):
return super().get_queryset(*args,**kwargs).filter(
author=self.request.user
).订购人('-date'u added')
此处
request.user
将包含登录用户。因此,将用户名存储在URL中毫无意义,因为用户确实可以篡改URL

当我只使用
get_queryset
功能时,它可以工作并显示我的模板,而不显示帖子,但是没有
userpassestimixin
test_func
,用户可以在URL中输入另一个人的用户名,并能够查看另一个人的帐户/帖子

事实上,即使使用
userpassestimixin
,在这种情况下,一个人也可以输入另一个帐户并获得访问权限,因为您使用的是
username
,而根本不考虑登录的用户

如果不想显示其他用户的帖子,则不应使用
URL参数。但请使用包含登录用户的
请求。用户

class UserSessionListView(LoginRequiredMixin, ListView):
    model = session
    template_name = 'programmerjournal/user_sessions.html'
    context_object_name = 'sessions'
    paginate_by = 24

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            author=self.request.user
        ).order_by('-date_added')
class UserSessionListView(LoginRequiredMixin,ListView):
模型=会话
模板名称='programmerjournal/user\u sessions.html'
上下文\对象\名称='会话'
分页单位=24
def get_queryset(self、*args、**kwargs):
return super().get_queryset(*args,**kwargs).filter(
author=self.request.user
).订购人('-date'u added')

此处
request.user
将包含登录用户。因此,将用户名存储在URL中是没有意义的,因为用户确实可以篡改URL。

我发现有一个参数
username
有点奇怪。因此,您的url包含一个本身不是登录用户的
参数?我使用的是内置的Django用户模型,该模型自动包含用户名属性,以便用户可以登录。通常在Django中,如果您自己没有指定一个
用户名
url参数,则没有该参数。此外,身份验证中间件将简单地向包含登录用户的请求添加一个
.user
属性,该用户是用户模型的一个对象。我对Django及其所有概念还是有点陌生,因此我不确定您最初的建议是什么。在阅读了你的补充回答和解释后,我现在明白了。你提供了一个极好的答案,帮助我掌握了一个我以前没有完全理解的Django概念。再次感谢!我发现有一个参数
username
有点奇怪。因此,您的url包含一个本身不是登录用户的
参数?我使用的是内置的Django用户模型,该模型自动包含用户名属性,以便用户可以登录。通常在Django中,如果您自己没有指定一个
用户名
url参数,则没有该参数。此外,身份验证中间件将简单地向包含登录用户的请求添加一个
.user
属性,该用户是用户模型的一个对象。我对Django及其所有概念还是有点陌生,因此我不确定您最初的建议是什么。在阅读了你的补充回答和解释后,我现在明白了。你提供了一个极好的答案,帮助我掌握了一个我以前没有完全理解的Django概念。再次感谢!我用你的建议更新了视图,效果非常好!我将进入并更改URL路径以排除用户名。非常感谢你!我用你的建议更新了视图,效果非常好!我将进入并更改URL路径以排除用户名。非常感谢你!