首页 > 解决方案 > django 权限:用户只能查看和编辑“他的”对象

问题描述

我正在构建一个管理公寓的应用程序:

有不同的行政部门。每个管理部门都有用户。每个政府都拥有房产,每个房产都有 1 到 n 个单位。

到现在为止还挺好。这或多或少是设置。

不,棘手的部分来了。行政部门 A 的用户只应被允许查看其行政部门拥有的房产和公寓。

我将如何最好地做到这一点?

标签: djangodjango-models

解决方案


假设 Administrator 模型和 User 模型之间存在 ForeingKey 关系,您可以对用户可以看到的内容进行过滤。例如:

class UserCreatesAndViewsSomething(LoginRequiredMixin, CreateView):
    model = UserLog (or something like that)
    template_name = 'some template you have'
    fields = ('field you want to display',)

# This function will submit the form to the database
    def form_valid(self, form):
        # this will help you determine what the current administrator is
        administrator = AdministratorModel.objects.get(user=self.request.user, administrator=self.kwargs['administrator'])
        form.instance.user = self.request.user

        # This will autopopulate administrator input to the current user administrator
        form.instance.administrator = administrator
        return super(UserCreatesAndViewsSomething, self).form_valid(form)

# get_context_data will help you determine what the user can see. 
    def get_context_data(self, **kwargs):
                administrator = AdministratorModel.objects.get(user=self.request.user, administrator=self.kwargs['administrator'])
        context = super(UserCreatesAndViewsSomething, self).get_context_data(**kwargs)
        context['something'] = to_journal_entry.objects.filter(user=self.request.user, administrator=administrator)
        return context

我知道这很多,但如果你完全熟悉 Django,你当然可以做到。您将不得不经历一些试验和错误,但这是我用于我的项目的方法。

最后注意,这假设您的所有用户和用户输入都在同一个数据库中,并且代码可以帮助您仅获取相关信息。如果您正在处理高重要性客户或一些敏感信息,您可能应该考虑多租户,这将为您的每个客户设置不同的架构或不同的数据库。这将导致不同的代码结构。

希望这可以帮助。


推荐阅读