<p>假设管理器的用户对象有一个名为unit的外键,其级别为它们所代表的级别(B1,C3,…)</p>
<p>首先,您需要一种方法来获取所有员工的后代。就像克莱德提到的,django mptt会让你的生活更轻松。只要在mptt设置正确的情况下运行<code>user.unit.get_leafnodes()</code>,您就拥有了所有受管员工。<br/>
见<a href="https://django-mptt.github.io/django-mptt/mptt.models.html#mptt.models.MPTTModel.get_leafnodes" rel="nofollow">MPTTModel.get_leaf_nodes</a>。你知道吗</p>
<p>那你需要利用这些信息。你知道吗</p>
<p>如果您使用的是django管理,那么可以在<a href="https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_queryset" rel="nofollow">ModelAdmin.get_queryset</a>中使用它。get\u queryset将请求作为参数。只要访问<code>request.user</code>,你就可以重新站起来了。然后你就可以用<a href="https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.has_change_permission" rel="nofollow">ModelAdmin.has_change_permission</a>和家人把事情锁得更紧一些。你知道吗</p>
<p>如果您想要更多的控制,请查看基于类的通用视图。你的<code>views.py</code>可以这么简单:</p>
<pre><code>from django.views import generic
from .models import Employee
class EmployeeList(generic.ListView):
def get_queryset(self):
return self.request.user.unit.get_leafnodes()
class EmployeeCreate(generic.edit.CreateView):
fields = ["name"]
def get_queryset(self):
return self.request.user.unit.get_leafnodes()
class EmployeeUpdate(generic.edit.UpdateView):
fields = ["name"]
def get_queryset(self):
return self.request.user.unit.get_leafnodes()
</code></pre>
<p>编辑视图将基于queryset返回的对象创建一个<a href="https://docs.djangoproject.com/en/1.9/topics/forms/modelforms/#django.forms.ModelForm" rel="nofollow">ModelForm</a>。字段属性是必需的。
参见<a href="https://docs.djangoproject.com/en/1.9/topics/class-based-views/generic-display/#generic-views-of-objects" rel="nofollow">generic views</a>和<a href="https://docs.djangoproject.com/en/1.9/topics/class-based-views/generic-editing/#model-forms" rel="nofollow">those based on models forms</a>上的文档。你知道吗</p>