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

时间:2013-03-06 10:21:16

标签: python django

我有可以通过多种方式查看的数据。不同的方式取决于用户是否登录/匿名,如果用户登录,则取决于用户是否是帖子的作者/读者。

我一直在查看基于django类的视图和django大括号,但我还没有找到解决这个问题的既定答案。我假设这种决策会产生一个树形结构,到目前为止,我看到的代码根据用户的权限将用户引导到一个URL,它不显示不同类型的数据,具体取决于用户的权限/登录状态。

处理此问题的最佳方法是什么?或者是否有我错过或未见过的代码处理此问题?

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

例如:

我访问了stackoverflow帖子。

显示帖子和评论。

如果是匿名用户,则显示连接stackoverflow数据元素。

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

如果是作者,则显示编辑发布数据元素。

如果不是作者,请不要显示编辑帖子数据元素。

如何正确表示django CBV中的上述条件语句?

1 个答案:

答案 0 :(得分:1)

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

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

另一个变体(如果你想在视图中执行所有逻辑)是创建一个mixin:

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 object-level permission packages感兴趣。这些包允许您为用户添加编辑给定对象的权限。在这种情况下,您可以在模板中写下类似的内容:

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

指向django docs的链接。