2010-10-30 4 views
6

У меня есть простой вопрос. Как создать роль пользователя в Django без его создания вручную?Как создать пользовательское разрешение (роль пользователя) в Django?

EDIT: Мне нужно создать специальное разрешение. Таким образом, только пользователи с таким разрешением могут изменять конкретное поле модели. Мне просто нужно сделать одно поле «readonly» для некоторых пользователей. Это возможно в джанго?

+0

Вы имеете в виду '/ admin/auth/group/add /'? –

+0

спасибо, но мне нужно создать специальное разрешение. Таким образом, только пользователи с таким разрешением могут изменять конкретное поле модели. Мне просто нужно сделать одно поле «readonly» для некоторых пользователей. –

+2

Вы можете определить пользовательское разрешение, например 'can_change_xy', и явно проверить это разрешение с помощью' user.has_perm() 'в вашей функции просмотра. Насколько мне известно, универсального решения для отдельных полевых разрешений нет. См. Http://docs.djangoproject.com/en/dev/topics/auth/#custom-permissions и http://docs.djangoproject.com/ru/dev/topics/auth/#django.contrib.auth.models. .User.has_perm. –

ответ

0

Вы можете проверить django-authority. Он позволяет вам реализовать разрешения уровня объекта и даже логические проверки. Логические проверки не хранятся в базе данных, а являются функциями, которые можно передавать значениям и возвращать True или False. Shameless вилка: моя вилка реализует Джанго 1,2 объекта разрешения бэкенд, так что вы можете использовать его как: userA.hasperm("see_xyz")

7

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

Если это нормально использовать Джанго разрешения sywstem, вы можете создать разрешение и проверить его overrriding админ сохранить метод ... Как:

в вашем models.py

class SomeModel(Model): 
    your_spec_field = FieldType(...) 
    class Meta: 
     permissions = (
      ("some_perm", u"A name for your default permission"), 
     ) 

В вашем связанном с admin.py

class SomeModelAdmin(ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     if change: 
      curr_value = SomeModel.objects.get(pk=obj.id) 
      if not request.user.has_perm('<your_app>.some_perm'): 
       obj.your_spec_field = curr_value.your_spec_field 
     else: 
      if not request.user.has_perm('<your_app>.some_perm') 
       obj.your_spec_field = '' # or the default value according to your field type 
     obj.save() 

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

Смежные вопросы