根据用户权限显示Django基于类的视图数据?
我有一些数据,可以用不同的方式来展示。这些展示方式取决于用户是否登录,以及如果用户登录了,还要看他是帖子作者还是普通读者。
我在研究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文档。