根据用户权限显示Django基于类的视图数据?

0 投票
1 回答
1854 浏览
提问于 2025-04-17 18:06

我有一些数据,可以用不同的方式来展示。这些展示方式取决于用户是否登录,以及如果用户登录了,还要看他是帖子作者还是普通读者。

我在研究django的类视图和django braces,但还没有找到一个明确的解决方案来处理这个问题。我猜这种决策会形成一个树状结构,而到目前为止,我看到的代码只是根据用户的权限引导用户到不同的链接,并没有根据用户的权限或登录状态来展示不同类型的数据。

处理这个问题的最佳方法是什么?或者我有没有遗漏什么代码,或者没有看到的代码可以处理这个问题?

注意:我想使用django的类视图。

举个例子:

我访问一个stackoverflow的帖子。

展示帖子和评论。

如果是匿名用户,展示加入stackoverflow的相关信息。

如果是登录用户,检查他是否是作者。

如果是作者,展示编辑帖子相关的信息。

如果不是作者,就不展示编辑帖子相关的信息。

我该如何在django的类视图中正确表示上述条件语句?

1 个回答

1

如果我是你,我会在模板里这样做:

{% if user == post.author %}
    display edit button
{% else %}
    display view button or something else
{% endif %}

还有一种变体(如果你想把所有逻辑放在视图里)是创建一个混合类:

class CanEditMixin(object):
    def get_context_data(self, **kwargs):
        """
        The method populates Context with can_edit var
        """
        # Call the base implementation first to get a context
        context = super(CanEditMixin, self).get_context_data(**kwargs)
        #Update Context with the can_edit
        #Your logic goes here (something like that)
        if self.request.user == self.get_object().author
            context['can_edit']=True
        else:
            context['can_edit']=False
        return context

然后你需要更新你的视图(顺序很重要):

class PostDetailView(CanEditMixin, LoginRequiredMixin, DetailView):
    #your view

还有你的模板也要更新:

{% if can_edit %}
    display edit button
{% else %}
    display view button or something else
{% endif %}    

另外,根据你问题的具体情况,你可能会对django对象级权限包感兴趣。这些包可以让你为用户添加编辑特定对象的权限。在这种情况下,你可以在模板里写类似这样的内容:

{% if perms.post.can_edit %}
    display edit button
{% else %}
    display view button or something else
{% endif %}   

还有一个链接到django文档

撰写回答