Как я могу разрешить редактирование объектов в Django Admin ТОЛЬКО для определенных объектов? - PullRequest
2 голосов
/ 07 марта 2011

В настоящее время я пишу сайт, который использует django-guardian для назначения разрешений на уровне объекта, которые используются по всему сайту.

Вот требуемая функциональность:

Я бы хотел, чтобы у пользователя были права на редактирование одного объекта (или нескольких объектов).Например, если есть пользователь с именем «Joe» и модель с именем «Partyline», я могу дать «Joe» определенные разрешения на «change_partyline» для 3 конкретных объектов «Partyline».

Когда Джо регистрируетсяв админ-панель Django, я бы хотел, чтобы он мог редактировать ТОЛЬКО 3 своих конкретных объекта "Partyline", так как это единственное, что он имеет право редактировать.

Вот текущийфункциональность:

Я могу назначить Джо полномочия change_partyline для 3 объектов Partyline - нет проблем.И Джо может войти в админку просто отлично.Проблема в том, что, поскольку у Джо нет «глобальных» разрешений на изменение ВСЕХ партилин, в админ-панели говорится, что у него нет никаких разрешений, и он не позволит ему ничего редактировать.Я хотел бы найти способ для администратора признать, что у Джо есть разрешения на редактирование только 3 конкретных объектов, и позволить ему просматривать и редактировать только те объекты, с которыми у него есть разрешения для работы.

Я быЛЮБЛЮ, чтобы найти способ сделать эту работу.Я активно использую администратор для того, чтобы мои пользователи могли прямо сейчас управлять всем, и это действительно нарушило бы презентацию, если бы пришлось перенести определенные функции из администратора в другие области сайта.

Если у вас есть какие-либо предложения, пожалуйста, дайте мне знать!

Для справки, вот некоторые результаты оболочки, демонстрирующие, что у пользователя есть разрешения change_partyline для объекта Partyline:

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(id=2)
>>> from apps.partylines.models import Partyline
>>> p = Partyline.objects.get(id=3)
>>> u.has_perm('partylines.change_partyline', p)
True

А вот мой модуль partylines.admin (которыйпоказывает, как модуль Partyline заполняется в админке):

from django.contrib import admin
from guardian.admin import GuardedModelAdmin
from apps.partylines.models import Partyline


class PartylineAdmin(GuardedModelAdmin):
    list_display = ('did', 'name', 'listed')
    ordering = ('did',)
    search_fields = ('did', 'name')

admin.site.register(Partyline, PartylineAdmin)

Ответы [ 2 ]

4 голосов
/ 01 июля 2011

Я задал похожий вопрос Lukazs (автору опекуна), и он сказал мне, что эта функция появится в будущем выпуске (см. Свойство user_can_access_owned_objects_only для этого коммита и связанной проблемы ). Если вы не готовы ждать, возможно, вы можете просто установить исходный код в основную ветку.

Задумывались ли вы о переопределении набора запросов в вашей модели? В моем случае было достаточно:

# models.py
from django.db import models
from django.contrib.auth import models as auth_models

class MagazineUser(models.Model):
    user = models.ForeignKey(auth_models.User, unique=True)

class Magazine(models.Model):
    managers = models.ForeignKey(MagazineUser)

# admin.py

class MagazineAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(admin.ModelAdmin, self).queryset(request)

        if request.user.is_superuser:
            return qs

        user_qs = MagazineUser.objects.filter(user=request.user)
        return qs.filter(managers__in=user_qs)
2 голосов
/ 07 марта 2011

Эта функциональность известна как «разрешения на уровне строк», и есть краткое объяснение некоторых методов администратора, которые вам необходимо переопределить в вики Django здесь .

Для вашего конкретного случая использования, я думаю, вы хотите установить связь ManyToMany между Partyline и User, чтобы объекты, разрешенные для пользователя, можно было получить с помощью:

objects = request.user.partyline_set.all()

Может быть достаточно просто переопределить queryset() и вернуть этот список объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...