【问题标题】:How to restrict certain fields in a model based on the user in django如何根据 django 中的用户限制模型中的某些字段
【发布时间】:2016-02-06 06:52:11
【问题描述】:

我有一个 Department 表。还有一个引用部门表的 Student 表。我还创建了一个自定义用户模型,UserAugment,将部门字段添加到默认用户模型。

class Department(models.Model):
    dname = models.CharField(max_length=200,primary_key=True)

    def publish(self):
        self.save()

    def __str__(self):
        return self.dname

class UserAugment(AbstractUser):
     department = models.ForeignKey(Department,null=True,blank=True)
     objects = UserManager()


class Student(models.Model):
    sname = models.CharField(max_length=200)
    usn = models.CharField(max_length=200,primary_key=True)
    dept = models.ForeignKey(Department)
    sem = models.IntegerField()

    def publish(self):
        self.save()

    def __str__(self):
        return '%s, %s' % (self.usn,self.sname)

现在,我需要创建用户,他们将拥有一个部门。并且每个用户都应该被授予添加/编辑/查看属于他们部门的学生的权限。我正在做噩梦。真的很简单吗?感谢您提供的任何帮助。

【问题讨论】:

    标签: django django-models django-admin user-permissions


    【解决方案1】:

    嗯,这对我来说终于奏效了,

     class StudentAdmin(admin.ModelAdmin):
         def get_queryset(self, request):
             qs = super(StudentAdmin, self).get_queryset(request)
             if request.user.is_superuser:
                 return qs
             return qs.filter(dept=request.user.department)
    

    【讨论】:

      【解决方案2】:

      您可以在后台管理权限控制:

      class UserAdmin(admin.ModelAdmin):
      
          def has_change_permission(self, request, obj=None):
              return self.user_has_permission(request, obj)
      
          def user_has_permission(self, request, obj):
              if hasattr(request.user, 'department') and obj is not None:
                  return request.user.department == obj.dept
              return False
      

      您可以以相同的方式实现editdelete 权限。

      【讨论】:

      • 一方面,它给'WSGIRequest'对象没有属性'obj'。对于第二部分,我不相信我的 admin.py 设置正确。我是否需要在 admin.py 中为我的 UserAugment() 编写任何相应的代码?类似于 admin.site.register(UserAugment,UserAdmin)
      • 我在 admin.py 中粘贴了 UserAdmin(admin.ModelAdmin)。我希望你提到 UserAdmin(models.ModelAdmin) 时这是一个错字
      • 是的,抱歉,已修复。是的,你需要 admin.site.register(UserAugment, UserAdmin)
      猜你喜欢
      • 2015-01-18
      • 2015-08-05
      • 2011-02-06
      • 1970-01-01
      • 2018-08-11
      • 2020-01-14
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      相关资源
      最近更新 更多