Отображать только те объекты в администраторе django на основе профиля пользователя, который связан с пользователем, который вошел в систему в данный момент.

Я хочу иметь администратора, в котором любой оператор, который входит в панель администратора, может только просматривать свои объекты пакета, а не видеть/изменять объекты пакета, добавленные другими операторами (от пользователя).

Мои модели:

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. Хотя письма видны, не могу добавить пакет под почтой другого оператора.

person Django-Rocks    schedule 24.01.2021    source источник


Ответы (1)


Package.operator является ForeignKey для модели UserProfile, вам нужно передать экземпляр этой модели в фильтр с request.user.profile, используя related_name из 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)
person Iain Shelvington    schedule 24.01.2021
comment
Привет @Iain, спасибо за решение, но я представил еще одну проблему с изображением. Можете ли вы решить это ?? - person Django-Rocks; 24.01.2021
comment
Привет, @Ian, есть обновления?? - person Django-Rocks; 25.01.2021