Понимание классов Python или настройка модели Django UserAdmin - PullRequest
1 голос
/ 01 декабря 2010

Я пытаюсь переопределить некоторые действия модели Django UserAdmin.В частности, я бы хотел скрыть поле 'superuser' от не суперпользователей.

Итак, мой подход такой:

class ModelAdmin(BaseModelAdmin):
    "Encapsulates all admin options and functionality for a given model."

    # ...

    def has_change_permission(self, request, obj=None):
        """
        Returns True if the given request has permission to change the given
        Django model instance.

        If `obj` is None, this should return True if the given request has
        permission to change *any* object of the given type.
        """
        opts = self.opts
        return request.user.has_perm(opts.app_label + '.' + opts.get_change_permission())

    #...

Основываясь на том, что я нашел в ModelAdmin

class UserAdmin(UserAdmin):
    """
    ... my customised UserAdmin
    """

    # adding a new method
    def is_superuser(self, request):
        "Returns True if the given user is a superuser."
        return request.user.is_superuser

    # then elsewhere 'hopefully' show a slightly different fieldset
    # the following, of course, doesn't work.

    fieldsets = (
        (None, {
            'fields': (
                ("first_name", "last_name"), 
                ("email", "password"), 
                "is_staff", 
                "is_active", 
                "is_superuser" if self.is_superuser() else None

            )   
        }),
        ('Groups', {
            'fields': (
                'groups', 
            )
        }),
        ('Meta', {
            'classes': ('collapse',),
            'fields': (
                'username',
                "last_login", 
                "date_joined"
            )
        })
    )

Итак, мои вопросы:

  • Как мне создать def в моем новом пользовательском классе UserAdmin, таком как выше, и как мне его вызвать?(Как мне узнать, когда я нахожусь в правильном контексте для этого)
  • Часть 2 (бонус): как я могу кратко включить / исключить поле 'is_superuser' в форме, как код psuedo вышепредлагает?

Доброе спасибо, ребята!

~ Дэрил

Спасибо

Ответы [ 2 ]

1 голос
/ 19 декабря 2010

Если вы просто хотите запретить пользователям рекламировать себя суперпользователю, переопределите YourUserAdmin.get_readonly_fields ():

class YourUserAdmin(admin.ModelAdmin):
    ...
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return None
        try:
            return self.readonly_fields + ('is_superuser',)
        except:
            return ('is_superuser',)

Вы должны отменить регистрацию пользователя / UserAdmin по умолчанию, а затем зарегистрировать свой собственный.

admin.site.unregister(User)
admin.site.register(User, YourUserAdmin)

Тем не менее, ZEN администратора говорит:

По своей сути, администратор Django предназначен для одного действия: доверенные пользователи редактируют структурированный контент.

Если пользователь не является доверенным, не давайте ему прав на редактирование учетных записей пользователей, точка. Даже если вы скрываете опцию superadmin и фильтр «filter by superadmin status», он может просто изменить ваш пароль и войти в систему как вы. Поэтому, если вам нужны недоверенные пользователи для редактирования учетных записей, забудьте администратора и напишите свой собственный тупой интерфейс.

0 голосов
/ 19 декабря 2010

Нет опыта работы с Django, но думаю, что закрытие может помочь вам в этой ситуации:

class UserAdmin(UserAdmin):

    # adding a new method
    def is_superuser(self, request):
        "Returns True if the given user is a superuser."
        return request.user.is_superuser

    def gen_fieldset(self, request):
        '''
        If request.user.is_supeuser == true then return fieldset generator for superuser.
         Else return fieldset generator for normal user.
         ''' 
        su = is_superuser(request)
        def get_fieldset():
            if su:
                return super_user_fieldset
            else:
                return normal_user_fieldset
        return get_fieldset

Использование будет выглядеть следующим образом:

obj = UserAdmin()
request = ... #Generate a normal or super-user request.
fieldset = obj.gen_fieldset(request)
# Sometime later when you want to use the fieldset...
fields = fieldset() # Function will decide which fieldset to give based on gen_fieldset() call earlier.

Таким образом, основная идея заключается в том, что вы можете настроить get_fieldset () заблаговременно (через вызов gen_fieldset () , где используется замыкание) для возврата соответствующего набора полей для уровень пользователя. Дайте пользователю функциональный объект, возвращаемый gen_fieldset () , который будет генерировать соответствующий набор полей позже, когда пользователь вызовет его.

ПРИМЕЧАНИЕ: Если вы никогда раньше не использовали замыкания, я бы предложил поискать другие примеры и использовать сценарии. Могут быть и другие решения, которые лучше подойдут для вашей ситуации (опять же, не знакомы с Django), но это было первое, что пришло мне в голову.

...