Есть ли способ сделать данные видимыми для каждого пользователя в трясогузке modeladmin? - PullRequest
0 голосов
/ 24 января 2019

Я добавляю менеджер генеалогического дерева в wagtail admin ModelAdmin, структура примерно такая:

Clients/
    Management
    Family Tree/
        Person/

Поэтому мне нужно убедиться, что каждое генеалогическое дерево и Person (члены генеалогического дерева)) доступны только пользователю, который вводит данные (и администратору).

Это мой первый раз с трясогузкой, я просто читаю документы, но любые советы приветствуются :)

1 Ответ

0 голосов
/ 24 января 2019

Фильтрация в представлении администратора модели

В вашем классе 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 отсутствует.

А затем установите это представление на вашей модели admin:

from wagtail.contrib.modeladmin.options import ModelAdmin
from myviews import FamilyTreeCreateView

class FamilyTreeAdmin(ModelAdmin):
    create_view_class = FamilyTreeCreateView
...