обновление readonly_fields в django на основании разрешения на изменение - PullRequest
2 голосов
/ 24 октября 2019

У меня есть проект Python Django, в котором я использую для отображения всех книг и рендеринга одной книги при нажатии на каждую книгу, чтобы Django автоматически генерировал детали книги.

, поэтому при рендеринге я хочу сделатьлогическое поле price_upgrade только для чтения, если у пользователя нет группы с именем author

, поэтому мои коды выглядят так:

class BookAdmin(admin.ModelAdmin):
    list_per_page = 10
    list_display_links = ['name']
    readonly_fields = ('id', 'name', 'city', 'price_upgrade')
    ...
    ...
    ...

def has_change_permission(self, request, obj=None):
        if request.user.groups.all().filter(Group ='author').exists():
            print('author group is there')
        else:
            print('author group is not there')
        #print('request', request.user.groups.all(), type(request.user.groups.all()))
        return True

как я могу добавить поле price_upgrade в readonly_fields, если текущий пользователь этого не делает? у нас не должно быть группы авторов, мы должны удалить поле price_upgrade из readonly_fields, потому что он является частью группы авторов, поэтому он может редактировать ее

версия python 2.7 django 1.8

Любая помощь приветствуется

1 Ответ

1 голос
/ 24 октября 2019

Вы можете переопределить changeform_view следующим образом в BookAdmin

       def changeform_view(self, request, *args, **kwargs):
            self.readonly_fields = list(self.readonly_fields)
            usergroup = request.user.groups.filter(name__in=['author']).exists()
            if not usergroup:
                self.readonly_fields.append('price_upgrade')

            return super(BookAdmin, self).changeform_view(request, *args, **kwargs)

ДРУГОЙ ВАРИАНТ: Обновлено Вы можете переопределить метод get_readonly_fields в вашем Admin

def get_readonly_fields(self, request, obj=None):
    usergroup = request.user.groups.filter(name__in=['author']).exists()
    if not usergroup:
       # since readonly_fields is a tuple we need to append to tuple
        self.readonly_fields = self.readonly_fields + ('price_upgrade',)
    return self.readonly_fields

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

Это то, что я обнаружил, пожалуйста, обновите, если есть какая-либо информация о пропусках

@ Обновление Существует проблема с кэшированием, поэтому она переопределяет разрешение, нужно найти решение для него, проблема в том, что вы вошли в систему с другим пользователем, у которого нет группы авторов. а выход из системы и вход с пользователем, у которого есть авторская группа, не смогут редактировать этот флажок, поэтому существует проблема с кэшированием. Скоро обновлю его, как только я найду решение. Если я перезагружаю сервер, он работает нормально, но перезапуск сервера не является правильным решением.

Связанный ref

Итак, после прохождения проблемы выяснил решение

def get_readonly_fields(self, request, obj=None):
        readOnlyFields = super(BookAdmin, self).get_readonly_fields(request, obj)
        usergroup = request.user.groups.filter(name__icontains='author').exists()
        if not usergroup:
            readOnlyFields = readOnlyFields + ('price_upgrade',)
        return readOnlyFields
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...