2013-03-06 66 views
0

我有可以多种方式查看的数据。不同的方式取决于用户是否登录/匿名,如果用户已登录,则取决于用户是否是帖子的作者/读者。根据用户权限显示基于django类的视图数据?

我一直在寻找通过基于Django类的视图和Django花括号,我还没有找到一个既定的答案来处理这个。我假设这种决策会产生一个树形结构,到目前为止,我所看到的代码会根据用户的权限将用户指向一个url,但不会显示取决于用户的不同类型的数据权限/登录状态。

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

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

例如:

我访问一个计算器后。

显示帖子和评论。

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

如果登录用户,请检查作者或不作者。

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

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

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

+0

什么样的一般你想使用,例如在ListView控件,您可以通过用户筛选查询。 – Denis 2013-03-06 10:28:37

+0

感觉这是在视图层次上完成的。你广泛提到“展示”,建议你可以(应该)在视图层次上做到这一点。如果您希望通过该类来完成,请使用根据用户状态返回不同结果的方法来扩展模型,然后始终在视图中调用这些方法(但这对于“连接框”不起作用,例如)。 – Evert 2013-03-06 11:23:15

回答

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

相关问题