首页 > 解决方案 > 根据与当前登录的用户相关的用户配置文件,仅在 django admin 上显示那些对象

问题描述

我希望有一个管理员,任何登录管理仪表板的操作员只能查看他们的包对象,而不能查看/更改其他操作员(来自用户)添加的包对象。

我的模型:

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="")

我的包/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) 函数,但它不起作用。

我的更新:

在此处输入图像描述

我在这里看到另一个问题。现在,虽然操作员无法查看/修改其他对象,但可以使用下拉列表中的电子邮件将包对象添加到其他操作员名称上。

这两个解决方案将是:

  1. 只有当前用户/配置文件在操作员字段中可见。
  2. 尽管电子邮件可见,但无法在其他运营商的电子邮件下添加包裹。

标签: djangofilterdjango-adminmultiple-usersdjango-admin-filters

解决方案


Package.operator是模型ForeignKeyUserProfile一个实例,您需要request.user.profile使用related_namefrom将此模型的实例传递给过滤器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)

推荐阅读