Есть ли способ сделать данные видимыми для каждого пользователя в трясогузке modeladmin?
Я добавляю менеджер генеалогического дерева в администратор трясогузки ModelAdmin, структура которого выглядит примерно так:
Clients/
Management
Family Tree/
Person/
Поэтому мне нужно убедиться, что каждое семейное дерево и Person (члены этого семейного дерева) доступны только пользователю, который вводит данные (и администратору).
Это мой первый раз с трясогузкой, я просто читаю документы, но любые советы приветствуются:)
1 ответ
Фильтрация по представлению администратора модели
В вашем классе ModelAdmin вы должны определить get_queryset
чтобы отфильтровать элементы, отображаемые в списке, в соответствии с вашими потребностями.
Однако он не только отображает элементы, но пользователь по-прежнему сможет получить доступ к другим элементам, изменив URL. Чтобы предотвратить это, вы захотите определить permission_helper_class
и установить user_can_inspect
, user_can_create
, user_can_edit
а также user_can_delete
методы для возврата True/False соответственно.
Присвоение пользователя созданному объекту
Исходя из вашего комментария ниже, давайте предположим, что у вас есть следующее определение модели:
from django.conf import settings
from django.db import models
class FamilyTree(models.Model):
managed_by = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=False)
# Some other fields.
Обратите внимание, что null=False
потерпит неудачу, если у вас уже есть некоторые записи в базе данных. Если это так, вам придется создать несколько пользовательских миграций.
Чтобы назначить пользователя, создающего объект с самим объектом, вам придется переопределить CreateView
модели админа с кастомным.
from django.forms.widgets import HiddenInput
from wagtail.contrib.modeladmin.views import CreateView
class FamilyTreeCreateView(CreateView):
def get_form(self):
form = super().get_form()
form.fields['managed_by'].widget = HiddenInput()
return form
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['data']['managed_by'] = self.request.user # Add the data so the form validates properly.
return kwargs
Обратите внимание, что таким образом он выведет скрытый managed_by
поле формы, которое вы позже установите на правильное значение. Если это проблема для вас, вам придется исключить поле и затем перезаписать form_valid
метод. Я решил не делать этого, потому что вам придется полностью перезаписать метод (и опыт показывает, что данное обновление Wagtail будет отличаться от вашей скопированной реализации, и вы этого не заметите), а не просто переопределить / расширить его при первоначальных вызовах метода form.save()
который потерпит неудачу как требуется managed_by
поле отсутствует.
И затем установите это представление на вашей модели администратора:
from wagtail.contrib.modeladmin.options import ModelAdmin
from myviews import FamilyTreeCreateView
class FamilyTreeAdmin(ModelAdmin):
create_view_class = FamilyTreeCreateView