根据与当前登录用户相关的用户配置文件,仅显示 django admin 上的那些对象

Display only those objects on django admin based on the user profile which is related to user that has logged in currenty

我想要一个管理员,任何登录管理仪表板的操作员都只能查看他们的包对象,而不是 see/change 其他操作员(来自用户)添加的包对象。

我的模特:

class Package(models.Model):
    operator = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
    destination = models.ForeignKey(Destination, on_delete=models.CASCADE)
    package_name = models.CharField(max_length=255)
    city = models.CharField(max_length=255)

class UserProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL,
                                related_name='profile', on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    user_type = models.CharField(max_length=1, choices=USER_TYPES, default='g')
    first_name = models.CharField(max_length=255, default="")

我的package/admin.py:

class PackageAdmin(ModelAdmin):
    icon_name = 'explore'
    autocomplete_fields = ['destination']         

    list_display = ('image_display','package_name',  'featured', 'price', 'discounted_price',
                    'savings', 'fix_departure', 'rating',
                     'date_created',)


    image_display = AdminThumbnail(image_field='thumbnail')
    image_display.short_description = 'Image'
    readonly_fields = ['image_display']

    def get_queryset(self, request):
        abc = super(PackageAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return abc
        else:
            operator = request.user.id
            return abc.filter(operator=operator)

我已经覆盖了 get_queryset(self, request) 函数,但它不起作用。

我的更新:

我在这里看到另一个问题。现在,虽然操作员不能 see/modify 另一个对象,但可以使用下拉列表中的电子邮件在另一个操作员名称上添加包对象。

两个解决方案是:

  1. 只有当前 user/profile 在运算符字段中可见。
  2. 虽然邮箱可见,但无法将包裹添加到其他运营商的邮箱下。

Package.operatorForeignKeyUserProfile 模型,您需要使用 [=15= 将此模型的实例传递给具有 request.user.profile 的过滤器] 来自 OneToOneField

def get_queryset(self, request):
    queryset = super(PackageAdmin, self).get_queryset(request)
    if request.user.is_superuser:
        return abc
    else:
        operator = request.user.profile
        return queryset.filter(operator=operator)