Есть ли способ сделать данные видимыми для каждого пользователя в трясогузке 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
Другие вопросы по тегам