Права администратора django для изменения атрибутов модели - PullRequest
3 голосов
/ 16 февраля 2011

мы используем django для разработки приложения для управления клиентами, и нам нужно установить агенту права доступа, может ли он / она редактировать атрибуты клиента ().

например,

если у меня есть модель:

class Customer(models.Model):
    # basic information
    name = models.CharField(max_length=150) # the name of this customer
    date = models.DateField(auto_now_add=True) # the date that this customer is created

    # personal information
    citizen_id = models.BigIntegerField(blank=True)
    phone = models.BigIntegerField(max_length=20, blank=True)
    work = models.CharField(max_length=100, blank=True)
    address = models.CharField(max_length=300, blank=True)
    bank_card = models.BigIntegerField()

    # installation detail 
    primary = models.IntegerField(default=0)
    secondary = models.IntegerField(default=0)
    region = models.ForeignKey(Region) # the region that this customer currently lives in
    type = models.ForeignKey(Type) # the installation type
    group = models.ForeignKey(Group)

    STATUS_CHOICES = (
                  ('Active', 'Active'),
                  ('Inactive', 'Inactive'),
                  ('Transfered', 'Transfered'),
                  ('Closed', 'Closed'),
                  ('Suspended', 'Suspended'),
                  ('Cancelled', 'Cancelled'),
                  )

    status = models.CharField(max_length=40, choices=STATUS_CHOICES)

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

пользователь A может редактировать телефон, адрес, работу и citizen_id пользователь B может редактировать только телефон и адрес, Пользователь C может редактировать Citizen_id, ..... и т.д ...

и я хочу иметь возможность устанавливать различные разрешения

Возможно ли это сделать? Было бы очень полезно, если бы я мог использовать систему администратора django для управления агентами и клиентами.

======================= Большое спасибо за ответ FallenAngel.

Я думаю, это именно то, что мы хотим.

это то, что я пробовал,

в admin.py

class CustomerAdmin(admin.ModelAdmin):
    def change_view(self, request, object_id, extra_context=None):
        agent = Agent.object.get(user=request.user)
        permitted_fields = agent.permitted_fields # assume i have this setup...
        self.readonly_fields = get_not_permitted_fields(premitted_fields) # assume I have this function written somewhere
        return super(CustomerAdmin, self).change_view(request, object_id,
            extra_context=None) 

это работает именно так, как я хочу: для недопустимых полей установите их только для чтения ...

Еще раз спасибо,

1 Ответ

3 голосов
/ 17 февраля 2011

Это возможно ... Вы должны использовать административные методы django , как они описаны здесь ... Вы должны определить функции add_view, change_view и changelist_view ...

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

Во-вторых, напишите основы добавления, изменения и просмотра списка, например:

class CustomerAdmin(admin.ModelAdmin):
    list_display= ["fields that will be used for all users"]

    def changelist_view(self, request, extra_context=None):
        if request.user == "type a":
            self.list_display.extend["list of other fields"]
        return super(CustomerAdmin, self).changelist_view(request, extra_context)

Вы должны указать представления добавления, изменения (и списка изменений, если требуется) и обрабатывать каждый тип пользователя. Затем Django покажет соответствующие поля для пользователя. Вы расширяете list_display, fileds, exclude, list_filter и такие методы отображения полей администратора django ...

...