Django基于字段阻止对detailview的访问

Django基于字段阻止对detailview的访问,django,detailview,Django,Detailview,我有一个detailView/模板,它有一个机密字段(布尔值),我希望只有员工用户(或更高级别的用户)才能访问详细信息页面。目前,我已将以下内容添加到我的模板中,使其正常工作: {% if enzymes.confidential == True %} {% if user.is_staff %} # confidential data is listed here {% else %} <p>You do not have access

我有一个detailView/模板,它有一个
机密
字段(布尔值),我希望只有员工用户(或更高级别的用户)才能访问详细信息页面。目前,我已将以下内容添加到我的模板中,使其正常工作:

  {% if enzymes.confidential == True %}
    {% if user.is_staff %}
      # confidential data is listed here
    {% else %}
      <p>You do not have access to this page</p>
    {% endif %}
  {% else %}
    # non confidential data is listed here
  {% endif %}

典型的方法是重写
get\u queryset
方法,如果用户不是工作人员,则过滤queryset。如果非工作人员试图访问机密项目,他们将获得404页面

class DetailView(generic.DetailView):
    template_name = 'gts/detail.html'
    model = Enzymes

    def get_queryset(self):
        queryset = super(DetailView, self).get_queryset()
        if not request.user.is_staff:
            queryset = queryset.filter(confidential=False) 
        return queryset

请注意,您不必将值与Django模板中的
True
False
进行比较。您可以将
{%if enzymes.secretary==True%}
简化为
{%if enzymes.secretary%}
。很好,这样可以覆盖类的所有默认函数吗?我不确定是否理解您的问题。基于类的泛型视图的主要好处是,您可以通过子类化和重写方法/属性来定制它们。困难的一点可能是知道这些方法是如何组合在一起的,这样您就知道要覆盖什么。我的意思是方法,我的错。
class DetailView(generic.DetailView):
    template_name = 'gts/detail.html'
    model = Enzymes

    def get_queryset(self):
        queryset = super(DetailView, self).get_queryset()
        if not request.user.is_staff:
            queryset = queryset.filter(confidential=False) 
        return queryset