Разрешения в Django (и Wagtail по расширению) обрабатываются для каждой модели, а не для каждого экземпляра.Следовательно, предоставление пользователю прав на Regbox
для редактирования позволит ему / ей редактировать все экземпляры этой модели.В Wagtail есть несколько исключений (например, модель Page).
В любом случае, вы сможете достичь желаемого и добавить настраиваемую проверку разрешений, прикрепив пользовательский класс помощника разрешений кВы ModelAdmin
определение.
from wagtail.contrib.modeladmin.helpers import PermissionHelper
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
from .models import Regbox
class RegboxPermissionHelper(PermissionHelper):
def user_is_owner(self, user, obj):
if user.pk == obj.owner:
return True
else:
return False
def user_can_inspect_obj(self, user, obj):
"""
Return a boolean to indicate whether `user` is permitted to 'inspect'
a specific `self.model` instance.
"""
return self.user_is_owner(user, obj) && super().user_can_inspect_obj(user, obj)
def user_can_edit_obj(self, user, obj):
"""
Return a boolean to indicate whether `user` is permitted to 'change'
a specific `self.model` instance.
"""
return self.user_is_owner(user, obj) && super().user_can_edit_obj(user, obj)
def user_can_delete_obj(self, user, obj):
"""
Return a boolean to indicate whether `user` is permitted to 'delete'
a specific `self.model` instance.
"""
return self.user_is_owner(user, obj) && super().user_can_delete_obj(user, obj)
class RegboxModelAdmin(ModelAdmin):
model = Regbox
permission_helper_class = RegboxPermissionHelper
modeladmin_register(RegboxModelAdmin)
Как видите, мы создаем новый вспомогательный класс RegboxPermissionHelper
и определяем методы для разрешений inspect
, edit
и delete
, которые сначала проверяют, чтопользователь является владельцем (это было извлечено из его собственного метода), а затем вызывает super, чтобы позволить исходной проверке разрешений произойти.Вызов super
важен, поэтому он возвращает false, если пользователь не является владельцем, но он также возвращает false, если пользователь является владельцем, но не имеет определенного разрешения (например, вы можете создавать и редактировать, но не удалять).
FWIW, я думаю, вы используете правильный механизм для фильтрации представления списка путем фильтрации queryset , поэтому ничего не меняйте там.