0

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

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

处理这个问题的最佳方法是什么?或者是否有我错过或没有看到处理这个问题的代码?

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

例如:

我访问了一个 stackoverflow 帖子。

显示帖子和评论。

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

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

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

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

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

4

1 回答 1

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 文档的链接。

于 2013-03-06T15:53:16.817 回答