python - 有没有一种干净的方法可以对 Django 中的某些用户隐藏模型属性?

标签 python django

我正在尝试在我的应用程序中引入字段级权限,以有效地对某些用户隐藏/取消模型字段值,同时向其他用户显示它们。用户需要能够执行如下操作:

class MyRestrictedModel(HypotheticalMixin, models.Model):
    public = CharField(max_length=128)
    restricted = RestrictedCharField(
        max_length=128,
        permitted_groups=("group1",)
    )

user1 = User.objects.get(pk=1)  # in group1
user2 = User.objects.get(pk=2)  # NOT in group 1

model_instance1 = MyRestrictedModel.objects.get(pk=1).restrict(user1)
model_instance2 = MyRestrictedModel.objects.get(pk=1).restrict(user2)

print(model_instance1.public)  # "this is public data"
print(model_instance1.restricted)  # "this is restricted data"

print(model_instance2.public)  # "this is public data"
print(model_instance2.restricted)  # None

我想我也许可以把一些东西组合在一起来让这个工作正常,但如果有更强大和社区接受的东西可用,我不想做那个工作,所以我想我会在这里问。有这种东西吗?

最佳答案

您需要添加属性、方法、组等,以便了解用户是否受到限制。假设你有 user.is_restricted 属性:

class RestrictManager(models.Manager):

  def by_user(self,user):

     queryset = super(RestrictManager,self).get_queryset()
     if user.is_restricted:
       queryset = queryset.annotate(field_to_show=None) # field_to_show is a queryset field (not in any model)
     else:
       queryset = queryset.annotate(field_to_show=secret_field)

     return queryset

class MyRestrictedModel(models.Model):

   field1 = models.CharField...
   restricted_objects = RestrictManager()

在您的代码中:

q = MyRestrictedModel.restricted_objects.by_user(self.request.user)
# Now use q as usual, q.all(), q.get(...), q.filter(...)

您当然可以添加更多方法,例如 by_group 等,甚至可以设置 objects=RestrictManager() 来替换对象默认管理器。

关于python - 有没有一种干净的方法可以对 Django 中的某些用户隐藏模型属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314819/

相关文章:

jquery - Django 依赖选择

python - Django 和 psycopg2 : FATAL: password authentication failed for user

django - 如何在 Django 数据库模型中使用父类(super class)型?

python - itertools.product - 返回列表而不是元组

python - 如何使用 python bottle 创建用户密码登录网页

python - 是否可以从 MX 查找中获取端口?

python - 无法解析超链接关系的 URL

python - 该 View 未返回 HttpResponse 对象。它返回 None 而不是

python - Plone2pdf 附加组件,portalTransform 异常 : ITransform

python阅读整个段落而不是阅读行