2013-12-21 7 views
4

У меня есть модель, которая выглядит следующим образом:разрешения на уровне объекта в Django администратора

class Change(models.Model): 
    RFC = models.CharField(max_length=10) 
    Ticket_Number = models.CharField(max_length=10) 
    Plan_Owner = models.ForeignKey(User) 

Я тогда зарегистрировать модели в админке Django с помощью этого:

class ChangeAdmin(admin.ModelAdmin): 
    search_fields = ('RFC', 'Ticket_Number','Plan_Owner') 
    list_display = ('RFC', 'Ticket_Number','Plan_Owner') 

    fieldsets = [ 
     ('Ticket Details', { 
      'fields': ['RFC', 'Ticket_Number', 'Plan_Owner']}), 
    ] 

admin.site.register(Change, ChangeAdmin) 

То, что я хочу, чтобы достичь является чтобы гарантировать, что Plan_owner для конкретного изменения является единственным, кто может редактировать его отдельно от суперпользователя. Каждый может просмотреть его, но владелец плана - единственный, кто может внести в него изменения. Также, редактируя, я имею в виду, он может делать что-либо, но удалять строку. Я посмотрел на хранителя Django, и он делает именно то, что я хочу, но нужно вручную установить разрешения для опекуна для каждой строки. Я ищу решение, в котором эти разрешения автоматически устанавливаются в соответствии с моими требованиями ...

ответ

5

Я бы не использовал разрешение на уровне объекта для чего-то простого, как ваше требование. Вам просто нужно иметь owner ForeignKey к вашей модели и позволяют только владелец каждого объекта, чтобы изменить его (вы можете использовать Plan_Owner - Пожалуйста, измените его plan_owner и Ticket_Number к ticket_number, чтобы быть совместимым с PEP 8 и django style guide) ,

Я написал пост, который описывает, как это сделать в Джанго:

http://spapas.github.io/2013/11/05/django-authoritiy-data/

На самом деле я описываю, как использовать органы, к которым принадлежат пользователи, и каждый пользователь может редактировать объекты своей власти, но ваше требование покрывается.

Update

Для полноты я добавляю реализацию здесь:

Ваших Создание и класс обновления на основе просмотры должны передать запрос в формы, а также ваш Detail и обновление ОЦК должно позволить только получать объекты, принадлежащие пользователю (давайте предположим, что ваша модель называется UserData:

class UserDataCreateView(CreateView): 
    model=models.UserData 

    def get_form_kwargs(self): 
     kwargs = super(UserDataCreateView, self).get_form_kwargs() 
     kwargs.update({'request': self.request}) 
     return kwargs 

class UserDataDetailView(DetailView): 
    def get_object(self, queryset=None): 
     obj = super(UserDataDetailView, self).get_object(queryset) 
     if not user_has_access(obj, self.request): 
      raise Http404(u"Access Denied") 
     return obj 

class UserDataUpdateView(UpdateView): 
    model=models.AuthorityData 

    def get_form_kwargs(self): 
     kwargs = super(UserDataUpdateView, self).get_form_kwargs() 
     kwargs.update({'request': self.request}) 
     return kwargs 

    def get_object(self, queryset=None): 
     obj = super(UserDataUpdateView, self).get_object(queryset) 
     if not user_has_access(obj, self.request): 
      raise Http404(u"Access Denied") 
     return obj 

Он проверяет, если request.user имеет permissi on (является владельцем объекта), а также передает request на номер ModelForm. Функция has_access определено выше только проверяет, является ли текущий пользователь является владельцем объекта:

def has_access(obj, req): 
    if req.user == obj.owner: 
     return True 
    return False 

Yot ModelForm должно быть, как это (то же самое для создания/обновления):

class UserDataModelForm(forms.ModelForm): 
    class Meta: 
     model = models.UserData 
     exclude = ('owner',) 

    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request', None) 
     super(ActionModelForm, self).__init__(*args, **kwargs) 

    def save(self, force_insert=False, force_update=False, commit=True): 
     obj = super(UserDataModelForm, self).save(commit=False) 
     if obj: 
      obj.owner = self.request.user 
      obj.save() 
     return obj 

Он удаляет request из kwargs и устанавливает его как атрибут, и при сохранении он устанавливает владельца объекта на reqest.user.

+0

Serafeim ... я получаю сообщение об ошибке в моем admin.py, говорящем: Exception Type: TypeError Исключительное значение: объект «tuple» не может быть вызван, когда я выполняю код в соответствии с начальным вопросом, который я опубликовал? Как обеспечить, чтобы все пользователи вошли в раскрывающееся меню администратора django в модели изменений? – Amistad

+0

Здравствуйте, Амистад, в реквизите вы создадите свои собственные представления для добавления/изменения объектов, а интерфейс администратора будет '' only'' использоваться у администраторов, имеющих доступ ко всем объектам!Если вы хотите иметь принадлежащие пользователю объекты также в своей панели администратора, тогда вы должны задать вопрос по другому вопросу (однако это сложнее и не предлагается, поскольку интерфейс администратора должен быть видимым только у администраторов, а не у обычных пользователей). – Serafeim

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