背景
我正在为一个度假租赁网站开发一个django应用程序。它将有两种类型的用户,租房者和物业管理者。
我希望物业经理能够在django管理中管理他们的出租物业。但是,他们只能管理自己的财产。
我意识到默认的django管理员不支持这个。我想知道添加这个功能会有多大的麻烦,如果可行的话,最好的处理方法是什么。
目标
理想情况下,我想象它是这样工作的:auth
已经允许这样的权限:
vacation | rental | Can add rental
vacation | rental | Can change rental
vacation | rental | Can delete rental
我想把它改成:
vacation | rental | Can add any rental
vacation | rental | Can change any rental
vacation | rental | Can delete any rental
vacation | rental | Can add own rental
vacation | rental | Can change own rental
vacation | rental | Can delete own rental
可能的解决方案
框架将如何决定租金(或其他)是否属于用户?我认为它会检查vacation.Rental
类,看看它是否有一个ForeignKey
到auth.User
(可能有一些特定的名称,比如“owner”)。
- 在创建新的
vacation.Rental
时,ForeignKey
字段的值将被强制为当前用户的id。ForeignKey
字段将不会显示在窗体上。 - 在列出租赁时,仅显示与当前用户匹配的
ForeignKey
的租赁。 - 在更改租赁时,仅显示与当前用户匹配的
ForeignKey
的租赁。ForeignKey
字段将不会显示在窗体上。
当然,这应该能够适用于任何具有适当ForeignKey
字段的模型,而不仅仅是我们的vacation.Rental
模型。
到目前为止,这听起来可行吗?或者我应该走另一个方向?
并发症
现在,棘手的部分来了我不知道该怎么办。假设一个Rental
可以有很多“RentalPhotos”。RentalPhoto
有一个ForeignKey
到Rental
。用户应该能够将照片添加到自己的租赁。但是,这些照片没有用户ForeignKey
,因此无法直接找出照片的所有者。
这可以通过框架中的一些技巧来解决吗?跟踪ForeignKey
s,直到找到一个对user有ForeignKey
的对象。或者我应该采取简单的方法,给予RentalPhoto
(以及其他“属于”Rental
的东西)自己的ForeignKey
赋予适当的auth.User
?第二种方法会带来不必要的冗余,第一种方法可能需要不必要的处理开销……
如果我完全迷路了,请不要犹豫,给我指出正确的方向。提前感谢任何帮助。
5条答案
按热度按时间kmpatx3s1#
我将简单地为每个模型
is_owned_by(user)
添加一个方法,并由模型决定它是否由该用户拥有。在大多数情况下,is_owned_by
可以是基本模型类中的泛型函数,您可以在特殊情况下调整它。例如这是足够通用的,并且是明确的,您将完全控制事情的行为。
要添加新权限,您可以将其添加到模型中,例如:
我认为不应该为
any
和own
添加两个权限,而应该只添加own
权限,这样每个对象都已经有了can_edit
,你可以把它当作用户只能编辑他的对象,如果用户有权限can_edit_any,那么只有他被允许编辑所有对象。使用这个,我们可以通过添加自定义后端来扩展auth。
这是一个非常快速的实现,实际上你可以扩展权限对象来检查它是否需要和对象。
permission.is_per_object
,而不是执行粗糙的字符串搜索,但如果您有标准名称,这也应该起作用mw3dktmi2#
如果你不想实现自己的权限后端,我建议你使用https://github.com/chrisglass/django-rulez。
mw3dktmi3#
在Django文档里。
基本上,你为你的模型创建自定义的管理类,并定义方法
get_queryset
。在你的情况下,它可能是下面的东西。超级用户将看到所有的租金,而业主只有他的。这是另一个可能的线索:https://code.djangoproject.com/wiki/RowLevelPermissions
r3i60tvu4#
这个问题可以通过框架中的一些技巧来解决吗?跟踪ForeignKeys,直到找到一个对user有ForeignKey的对象。
我看不出有什么必要耍花招:RentalPhoto -> Rental -> User因此,要获取特定RentalPhoto的User,您可以在示例中调用如下内容:
在一个步骤中遵循多个关系可以被认为是非欺骗。
kx1ctssn5#