Я бы не использовал разрешение на уровне объекта для чего-то простого, как ваше требование. Вам просто нужно иметь 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
.
Serafeim ... я получаю сообщение об ошибке в моем admin.py, говорящем: Exception Type: TypeError Исключительное значение: объект «tuple» не может быть вызван, когда я выполняю код в соответствии с начальным вопросом, который я опубликовал? Как обеспечить, чтобы все пользователи вошли в раскрывающееся меню администратора django в модели изменений? – Amistad
Здравствуйте, Амистад, в реквизите вы создадите свои собственные представления для добавления/изменения объектов, а интерфейс администратора будет '' only'' использоваться у администраторов, имеющих доступ ко всем объектам!Если вы хотите иметь принадлежащие пользователю объекты также в своей панели администратора, тогда вы должны задать вопрос по другому вопросу (однако это сложнее и не предлагается, поскольку интерфейс администратора должен быть видимым только у администраторов, а не у обычных пользователей). – Serafeim