我有可以通过多种方式查看的数据。不同的方式取决于用户是否登录/匿名,如果用户登录,则取决于用户是否是帖子的作者/读者。
我一直在查看基于django类的视图和django大括号,但我还没有找到解决这个问题的既定答案。我假设这种决策会产生一个树形结构,到目前为止,我看到的代码根据用户的权限将用户引导到一个URL,它不显示不同类型的数据,具体取决于用户的权限/登录状态。
处理此问题的最佳方法是什么?或者是否有我错过或未见过的代码处理此问题?
注意:我想使用基于django类的视图。
例如:
我访问了stackoverflow帖子。
显示帖子和评论。
如果是匿名用户,则显示连接stackoverflow数据元素。
如果登录用户,请检查作者是否作者。
如果是作者,则显示编辑发布数据元素。
如果不是作者,请不要显示编辑帖子数据元素。
如何正确表示django CBV中的上述条件语句?
答案 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的链接。